投稿記事

Hermes TrisClistos 2021/07/12 23:17

forループを活用して「風俗の予約システム」をつくる(途中) / デリヘル純愛ゲーム(仮)制作日誌

目指すシステム要件が「登場するデリヘル嬢が数十~100人でも耐えられるもの」であることを踏まえれば、スクリプトのベタ打ちではなく、データ量の変更にも対応できる柔軟なシステムが必要です。

と、いうことで、嬢や何百人でも、デリヘル店やホテルが何十軒であっても対応できるように、forループ文で予約システムを構築しなければなりません。

……手こずっていました。どうにか形にできたので途中経過を報告しておきます。

▼まずは動画をご覧ください

デリヘル店に電話して、このあとのプレイ予約をしているところです。今回の『デリヘル純愛ゲーム(仮)』の根幹をなすシステムのひとつ。

はじめ、ティラノスクリプトの[iscript]タグ内にて、JavaScriptのforループで構築しようと考えて、実際に取り組みましたが……TS(ティラノスクリプト)とJSが混在して、うまくループできませんでした。

ということで、まずはティラノスクリプトだけでforループ文っぽいものを作ってみました。

参考にしたのは ティラノスクリプト備忘録20 ループ処理 - ごいしはまぐり このウェブサイトの説明。おかげで助かりました。

;ループ開始[p]

[eval exp="f.cnt=0"]

*loopstart

;ここに処理を入れる
;ループ[emb exp="f.cnt"]回目[p]

[eval exp="selectShop1NamePositionY+=selectItemLineSpacing"]
[eval exp="selecShop1ClickPositionY+=selectItemLineSpacing"]

;ラベル生成
[eval exp="f.arrayShopSelectDone[f.cnt]"]

;ループカウント5の時*loopendへジャンプ
[jump target=*loopend cond="f.cnt==f.arrayShopSelectDoneLength"]

;店名1
[backlay]
[ptext page=back text="&arrayShopName[f.cnt]" layer=0 size=&selectShop1FontSize x=&selectShop1NamePositionX y=&selectShop1NamePositionY color=0xffffff zindex=2]
[trans time=0 layer=0]
[wt]

;クリック部分の指定 1個目の選択ボタン
[locate x=&selecShop1ClickPositionX y=&selecShop1ClickPositionY]
[clickable width=&selecShop1ClickWidth height=&selecShop1ClickHeight border="solid:1px:red" mouseopacity="50" target=&f.arrayShopSelectDone[f.cnt]]

;ループカウント+1する
[eval exp="f.cnt=f.cnt+1"]

;ループ最初に戻る
[jump target=*loopstart]

*loopend
;クリック用のストップタグ。これがないと一覧出力できない。
[s]
ループ終了[p]

このforループは「デリヘル店」(一列目)のもの。あとはコピペして「デリヘル嬢」(2列目)、ラブホ(3列目)を実装すれば、予約システムは完成です。

このforループ部分の以前には、座標情報などを格納するための変数を設定しています。

◆ -- 電話で予約システムの変数 -- 
[iscript]
//「項目1」の名前を格納する変数
selectItem1Name = '店名';
//「項目1」の文字サイズを格納する変数
selectItem1FontSize = 40;
//「項目1」の表示位置Xを格納する変数
selectItem1PositionX = 50;
//「項目1」の表示位置Yを格納する変数
selectItem1PositionY = 135;
//店名を格納する変数
//shopName[0]
//「店名1」の文字サイズを格納する変数
selectShop1FontSize = 30;
//項目同士の間隔
selectItemLineSpacing = 35;
//「店名1」の表示位置Xを格納する変数
selectShop1NamePositionX = selectItem1PositionX;
//「店名1」の表示位置Yを格納する変数
selectShop1NamePositionY = 155;
//「店名1」のクリック部分位置Xを格納する変数
selecShop1ClickPositionX = 48;
//「店名1」のクリック部分位置Xを格納する変数
selecShop1ClickPositionY = 160;
//「店名1」のクリック範囲幅を格納する変数
selecShop1ClickWidth = 300;
//「店名1」のクリック範囲高を格納する変数
selecShop1ClickHeight = 30;
//「店名1」のクリック確定後の画像表示位置Xを格納する変数
selecShop1ClickDonePositionX = 48;
//「店名1」のクリック確定後の画像表示位置Yを格納する変数
selecShop1ClickDonePositionY = 195;

//「項目2」の名前を格納する変数
selectItem2Name = '所属キャスト';
//「嬢の名前」表示位置Xを格納する変数
selectLady1NamePositionX = '1';
//「嬢の名前」表示位置Xを格納する変数
selectLady1NamePositionY = '1';

//「項目」の名前を格納する変数
selectItem1Name = '店名';

項目1 とか selectItem1Name とか、「1」というナンバリングをしていますが、これはプロトタイプでつくった「ティラノスクリプトのベタ打ち」の名残です。
forループを使うならば、 変数名は 抽象的に selectItemName というような感じがわかりやすいのではないでしょうか。あとでリネームします。

ループ処理をほどこすことで、これら変数に「行間の数値」がプラスされて、「デリヘル店Aの名前」を表示するためのX座標・Y座標、「デリヘル店Bの名前」を表示するためのX座標・Y座標……「デリヘル店Zの名前」を表示するためのX座標・Y座標……というふうに、データ数のぶんだけ格納されていき、順番に整然とゲーム画面に出力されるわけです。

ちなみに、ティラノスクリプトでデータベースを使う方法がよくわからないので、各種データはTSの[loadjs]タグをつかって、JSファイルにまとめています。

;デリヘル嬢の情報配列
[loadjs storage="ladyarray.js" ]

C:\TyranoStudio_win_std_v110d\myprojects\test\data\others\ladyarray.js
loadjsタグで呼び出すJSファイルの置き場所は otherフォルダ。デフォルト設定では。

//登場するデリヘル嬢のリスト
//Sグレードのデリヘル嬢 10名まで
defaultLadyName1 = '沙友理';
defaultLadyName2 = '茜';
defaultLadyName3 = 'まみ';

//Aグレードのデリヘル嬢 20名まで
defaultLadyName4 = 'カレン';
defaultLadyName5 = 'まさみ';
defaultLadyName6 = '結衣';

//Bグレードのデリヘル嬢 40名まで
defaultLadyName7 = 'こなた';
defaultLadyName8 = 'かがみ';

arrayLady1 = [defaultLadyName1, 'SS', 3000, 19, 'flesh', 0];
arrayLady2 = [defaultLadyName2, 'A', 2000, 22, 'used', 0];
arrayLady3 = [defaultLadyName3, 'B', 1000, 42, 'used', 0];
arrayLady4 = [defaultLadyName4, 'B', 1000, 42, 'used', 0];
arrayLady5 = [defaultLadyName5, 'B', 1000, 42, 'used', 0];
arrayLady6 = [defaultLadyName6, 'B', 1000, 42, 'used', 0];
arrayLady7 = [defaultLadyName7, 'B', 1000, 42, 'used', 0];
arrayLady8 = [defaultLadyName8, 'B', 1000, 42, 'used', 0];

ちなみに、配列データベースの管理はエクセルでおこなっています。

この話は、いずれそのうちに。

以上です。疲れた。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Hermes TrisClistos 2021/07/10 21:30

コース選択システムをティラノ&Javascriptで構築する / デリヘル純愛ゲーム(仮)制作日誌

開発当初はヒロイン3名のつもりでしたが……現在では、デリヘル嬢100人でも対応できる方向で開発しています。人数多いほうがシミュレーションゲームとして面白いですからね。

ーーーーーーーーーーーーーーーーーーーーー

きょう報告するのは、プレイ料金決定システムです。
デリヘルのコース料金は、店のグレード(ランク)で決まります。

【基本料金】
激安店であれば60分9千円以下、標準(スタンダード)店であれば60分1万円台前半、高級店であれば、60分2万円以上……など。

【指名料】
激安店は無料だったり1000円だったり。スタンダード店は高くても2000円、嬢のランクによっては3000円の場合も。高級店は3000円~。

【割引、イベント】
入店1ヶ月の「新人」には指名料が無料になる「新人割」。ただし1人の嬢に対して1回のみ。

熟女店ならば指名料が0円になる「四十路(よそじ)割」」で、こちらは何回でも指名料無料という場合が多いですね。

はじめて利用する客のために「新規割」というのも見かけます。これも初回のみ。

……以上のようなものを、IF文やSWITCH文をつかった条件分岐で実現しよう、というわけです。

▼まずは動画をご覧ください

まみちゃん。SSランク店に所属しています。属性:flesh つまり新人です。指名回数:0 なので、動画のとおり「新人割」が適用されています。

つぎは、熟女店のデリヘル嬢を選んだ場合の動画です。

四十路割が適用されています。もしも熟女デリヘル嬢「とし子」が新人だったとしても、四十路割が優先して適用されます。2つ以上の割引、つまり割引の併用はNG。実店舗でも同様です。

ちなみに、デリヘル店の「割引」は、クーポンと同様に「使う意思」を伝えなければ有効になりません。現実でもゲームでも、デリヘル利用を申し込むときに「割引を使いたい」と入力しないと、四十路割は適用されない仕組みです。

if (f.ladyAge < 40 && arrayLady[5] < 1 && arraytLady[4] === 'flesh'){
	f.nominationFee = 0;
}else{
	//alert('新人割ルートのelse')
}

//四十路割(コース料金の割引+指名料無料)の判定
//指名回数にかかわらず有効

if (f.ladyAge > 39){
	f.nominationFee = 0;
}else{
	//alert('四十路割ルートのelse');
}

実際のJavaScriptコードは上記のようなかんじ。単純です。

デリヘル嬢の各種データは、配列に格納しています。

//登場するデリヘル嬢のリスト
//Sグレードのデリヘル嬢 10名まで
defaultLadyName1 = 'まみ';

//Aグレードのデリヘル嬢 20名まで
defaultLadyName2 = '沙保里';

//Bグレードのデリヘル嬢 40名まで
defaultLadyName3 = 'とし子';

//[0]名前、[1]店グレード、[2]指名料、[3]年齢、[4]新人判定(flesh or used)[5]指名回数
arraylady1 = [defaultLadyName1, 'SS', 3000, 19, 'flesh', 0];
arraylady2 = [defaultLadyName2, 'A', 2000, 22, 'used', 0];
arraylady3 = [defaultLadyName3, 'B', 1000, 42, 'used', 0];

そのほか「好感度」や「本番交渉の成否」などの各種パラメータも格納できます。

つぎは、ふつうのデリヘル嬢の場合。

「沙保里」は新人ではないので、基本料金+指名料を要します。ふつうはコレです。

//所属店グレードSの嬢のコース料金 これに個人グレード(指名料金)を足す
//もしも「初回割」判定を足すなら、はじめにif文でふるいおとす。
var gradeSS = 'SS';
var gradeS = 'S';
var gradeA = 'A';
var gradeB = 'B';
var gradeC = 'C';

switch ( arrayLady[1]) {
case gradeSS :
	switch (f.courseTime) {
	case 60 :
	f.coursePrice = 25000;//コース料金
	f.nominationFee = arrayLady[2];//指名料
	break;
	case 75 :
	f.coursePrice = 30000;
	f.nominationFee = arrayLady[2];//指名料
	// alert(f.coursePrice);
	break;

	case 90 :
	f.coursePrice = 35000;
	f.nominationFee = arrayLady[2];//指名料
	break;

	case 120 :
	f.coursePrice = 50000;
	f.nominationFee = arrayLady[2];//指名料
	break;

	case 180 :
	f.coursePrice = 70000;
	f.nominationFee = arrayLady[2];//指名料
	break;

	//フリー料金?
	default :
	alert("フリー料金");
	break;}
break;

case gradeS :
	switch (f.courseTime) {
	case 60 :
	f.coursePrice = 24000;//コース料金
	f.nominationFee = arrayLady[2];//指名料
	break;
	case 75 :
	f.coursePrice = 15000;
    
    以下略

ただし、イベントで「●●割」が発生することがあるので、そのときはお得に遊べるわけ
です。

このような感じでシステムを構築すれば、嬢データが何人増えても対応できるはずです。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Hermes TrisClistos 2021/07/03 23:54

ティラノスクリプトで条件分岐(3つ以上)を使うときのいろいろ / デリヘル純愛ゲーム(仮)制作日誌

アルバイトを重ねるごとに、高時給のアルバイトにステップアップできるシステム。
条件分岐(if文)の出番です。

アルバイトA 時給1,500円
アルバイトB 時給3,000円
アルバイトC 時給6,000円
アルバイトD 時給12,000円

単純に考えれば、低時給アルバイトを「上から順番に」並べてif文を書いてしまいがちですが……。
分岐が3つ以上ある場合は、むしろ数値が大きいもの(高時給アルバイト)をif文の先頭から書いていくのが正解っぽいです。

[eval exp="f.arbeit1=2"] 
[eval exp="f.arbeit2=3"] 
[eval exp="f.arbeit3=4"] 

;アルバイトD 5回目以降
[if exp=" f.arbeitCount > f.arbeit3"]
アルバイトDで3時間働いた![r]
36,000円ゲット![l]

;アルバイトC 4回目から
[elsif exp=" f.arbeitCount > f.arbeit2"]
アルバイトCで3時間働いた![r]
18,000円ゲット![l]

;アルバイトB 3回目から
[elsif exp="f.arbeitCount > f.arbeit1"]
アルバイトBで3時間働いた![r]
9,000円ゲット![l]

;アルバイトA 2回目まで
[else]
アルバイトAで3時間働いた![r]
4,500円ゲット![l]
[endif]

さらに「6回目以降」の「アルバイトE」を増やしたければ、先頭のif部分に追加する。増えるのは elsif 部分だけ。

[if]6回目以降 アルバイトE
[elsif]5回目 アルバイトD
[elsif]4回目 アルバイトC
[elsif]3回目 アルバイトB
[else]2回目まで アルバイトA
[endif]

elsif を elseif と記述しないように注意。当然エラーになります。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Hermes TrisClistos 2021/07/01 22:45

ティラノスクリプトのマクロ機能を使ってみる / デリヘル純愛ゲーム(仮)制作日誌

体調を崩して、半月も開発が停滞しました。きょうから再開。

スクリプト記述の簡略化。これをやりたい。ティラノスクリプトの「マクロ」や「サブルーチン」で実現できそうだが、いまいち具体的な使い方がわかりませんでした。今までは。

公式解説を眺めながら、なんとなく使ってみました。

サブルーチンとマクロ-使い方&チュートリアル - ティラノスクリプト
https://tyrano.jp/usage/tech/macro

マクロとは

ティラノスクリプトに備わっている「既存の命令」を組み合わせて、「新しい命令」を作ることができる……という理解をしています。とりあえず。

[macro name=mornigLeftSlide]
;朝背景にスライド
[backlay]
[bg storage=1280house_room_weekly_apartment_a.jpg time=500 wait=false method=slideInLeft]
[trans time=0 layer=0]
[wt]
[endmacro]

[macro name=wednesday]
;「曜日」表示の変更
[eval exp="f.youbi='水曜日'"]
[backlay]
[ptext page=back text="&f.youbi" layer=0 size=40 x=200 y=55 color=0xffffff face="sans-serif" name="youbi" overwrite=true]
[trans time=0 layer=0]
[wt]
[endmacro]

[macro name=turnStartMessage]
;ターン開始メッセージ
[emb exp="f.month"]・[emb exp="f.week"]・[emb exp="f.youbi"]です。[p]
[endmacro]

mornigLeftSlide …「朝」背景を「左スライド表示」するユーザー定義の命令
wednesday…「曜日」変数に「水曜日」を代入する命令
turnStartMessage…ターン開始を報せる定型メッセージを表示する命令

この3つのマクロを設定することによって、ターン遷移に必要なスクリプトが簡潔になります。

;◆7月・第1週・水曜日
[mornigLeftSlide]
[wednesday]
[turnStartMessage]

さらに、その他いろいろの機能をマクロ化すると……1ターン分のスクリプト記述は下記のように省略することが可能です。

;◆7月・第1週・月曜日
[eveningLeftSlide]
[month7]
[weekfirst]
[monday]
[baseDayMoneyStatus]
[turnStartMessage]
[dayActionSelect]
[dayEndMessage]

こんな感じで「スクリプト全体の見通しが良くなる」というわけです。

今回の「純愛デリヘルゲーム」は、月水金✕4週間✕12ヶ月=144ターンです。
馬鹿正直にスクリプトを書いていたら、修正するだけでも膨大な労力を要します。

マクロ化してスクリプト全体の見通しを良くすることは開発効率に関わります。あらゆる機能を積極的にマクロ化していきたいです。

サブルーチンについては、いずれ。まだよくわかっていません。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Hermes TrisClistos 2021/06/13 16:54

ptextで「金額」を表示する(3桁カンマ、額面の右寄せ固定) / デリヘル純愛ゲーム(仮)制作日誌

ティラノスクリプトのptextタグの使い方を、またひとつ学ぶことができました。

  1. ptextで表示する「所持金」表示の1桁目の位置を固定したい
  2. ptextで表示する額面に3桁カンマ(例:100,000)を付け加えたい

▼まずは動画をご覧ください

以下は解説です。

数値の1桁目の位置を固定する方法

ptextの標準機能で実現できました。

[backlay]
[ptext page=back text="&f.str_money" layer=0 size=50 x=915 y=0 color=0xffffff edge=0x000000 name="money" bold=bold width=300 align="right"]
[trans time=0 layer=0]
[wt]

width=300 align="right" の部分です。

額面に3桁カンマ(例:100,000)を付加する

標準機能で実現する方法がわからず、ググったら、ティラノスクリプトのptext拡張プラグインを見つけました。

ティラノスクリプト:文字列整形プラグイン

作者のTwitter:こ・ぱんだ(@ko10panda)

上記プラグインの機能のひとつである addComma(num) 関数を利用しました。

;文字整形プラグイン(3桁カンマ等)
[plugin name="format"]

;所持金
[eval exp="f.money=150000"]
;ptext表示のため、数値を、文字列変数(str_)に代入
[eval exp="f.str_money=addComma(f.money)"]

;所持金の額面をptexで表示する
[backlay]
[ptext page=back text="&f.str_money" layer=0 size=50 x=915 y=0 color=0xffffff edge=0x000000 name="money" bold=bold width=300 align="right"]
[trans time=0 layer=0]
[wt]

:総資産
[eval exp="f.assets=500000"]
;ptext表示のため、数値を、文字列変数(str_)に代入
[eval exp="f.str_assets=addComma(f.assets)"]

;総資産の額面をptexで表示する
[backlay]
[ptext page=back text="&f.str_assets" layer=0 size=50 x=915 y=50 color=0x000000 edge=0xffffff name="assets" bold=bold width=300 align="right"]
[trans time=0 layer=0]
[wt]

;収入変数は income
[eval exp="f.income=3000000"]
[emb exp="addComma(f.income)"](3百万)円を受け取った![l][cm]

;計算して再代入
[eval exp="f.money+=f.income"]
[eval exp="f.assets+=f.income"]

;ptext表示のため、数値を、文字列変数(str_)に代入
[eval exp="f.str_money=addComma(f.money)"]
[eval exp="f.str_assets=addComma(f.assets)"]

;所持金の額面を上書きする
[backlay]
[ptext page=back text="&f.str_money" layer=0 size=50 x=915 y=0 color=0xffffff name="money" overwrite=true]
[trans time=0 layer=0]
[wt]

;総資産の額面を上書きする
[backlay]
[ptext page=back text="&f.str_assets" layer=0 size=50 x=915 y=50 color=0x000000 name="assets" overwrite=true]
[trans time=0 layer=0]
[wt]

おなじ所持金(money)変数ですが、「計算用」と「ptext表示用」に分けたほうが良さそうです。よくわかりませんが。

money が計算用の数値変数。
str_money がptextで利用するための3桁カンマを付加した文字列変数。
文字列(string)の意味で str_ と命名しました。

最適解ではないかもしれませんが、とりあえず実現できました。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

1 2 3 4 5 6 7

月別アーカイブ

限定特典から探す

記事を検索