はてなキーワード: voidとは
There is an epidemic of people misunderstanding what hit points are and why you gain them. This rant/explanation is fueled by an argument I had with one of my players and too many comments on DnD streams where people misunderstand HP. The only part of your HP that determines how much damage you can physically withstand is the Con modifier you add, the rolled HP is combat experience, luck and mental fortitude. Let me explain.
A lvl 20 Goliath Barbarian at full heath gets stabbed in the head with with a simple 1d6 sword. That Goliath is dead, gaining HP isn’t becoming tough enough to survive a sword to your goddamn cranium, it’s gaining enough combat experience that you’re able to avoid the deadly blow and instead only suffer a cut in your arm.
This is the entire concept of sneak attack and critical hits. The rogue isn’t suddenly hitting you harder than normal, they’re slipping past your defenses to deal the realistic damage of you getting stabbed in the kidney. When you crit you aren’t hitting harder than you were before you’re landing a solid hit that your opponent is having a harder time avoiding.
This is why your rolled HP is dependent on your class and not your race, and why martial classes have the highest hit die. A knife in the gut is a much more dangerous when you’re a gnome than when you’re a Goliath unless the gnome is a fighter and the Goliath is a wizard. One has much more combat experience than the other and is able to avoid the deadlier hit.
Edit: again this is also why you heal to full HP after a long rest. You aren’t magically healing hundreds of cuts on your body, you’re becoming rested enough that you’re able to avoid that dagger to your neck.
Edit 2: I avoid taking about spells because magic is fucking weird.
Also poison damage. It’s about how much poison/venom is actually able to get into your system before you’re able to pull back and avoid it.
https://anond.hatelabo.jp/20250630233246
アゴダのXが日本語ワカリマセン〜英語で言って!というので勝手ながらこちらの増田を途中までですが英語にさせてください&かなり意訳許してください&違和感間違い等あったら有識者教えて
Agoda makes many troubles on travel, Latest news in Japan told as so.
But "I" think there's accomplice.
"I" am a Manager of Hotel in Tokyo and I was involved many troubles made by Agoda and accomplice.
I want to everyone aware and avoid troubles...and I also wanted to say about, usually, Japanese Hotel staff are HATE Agoda.
Basically, Agoda bought room bookings from Hotels and sell with charge like other OTA.
But, the difference is, Agoda also sell "other agent's" room stock.
for example, some Japanese major agent "Rakuten" or "Jaran" are making partnership with Agoda and Agoda users can booking partners stock.
This case, Hotels agreed booking by Agoda at sell Japanese agent and user and Hotels can confirm booking route like "Jaran via Agoda" on each systems. almost this case not make troubles.
But, next case is problem... Agoda is also buying room stock from Suspicious agent.
I think this case causes complain of Hoshino Resort and Toyoko inn.
Sometime Agoda propose very cheap reservation than other reservation of same hotel, day, conditions.
Usually, user choice and buy such reservation.
but, this case, the booking not complete.
Hotels are noticed as only "from Expedia Affiliate Network".
Agents are usually make contract with hotels, but its pretty expensive for smaller agent.
then, Expedia provide booking search engine service for mainly such agents.
Sometime Airlines uses this to add hotel booking to their own airplanes booking and make travel deal.
Then, the service MUST contain suspicious agents.
and the booking route CAN take like below.
Agoda⇨agent A⇨agent B⇨C..⇨Hotel
And the sucks, the case must threw many Suspicious Agent (of suspicious country) (and sometime the bookings are actually not exists).
So, When trouble occurs, hotel can not confirm "where is matter and why trouble occurs"
I think, Expedia need survey and not allow these suspicious agents.
But also, WE hotel staff think Agoda seems running away from responsible action with saying "it's not our problem", they must be aware and take responsible action for such case!
神クラス(God Object)は、ソフトウェア設計においてアンチパターン(避けるべき設計手法)として知られています。
これは、過剰に多くの責任を持ちすぎるクラスやオブジェクトのことであり、ソフトウェアの保守性や拡張性、可読性に大きな問題を引き起こします。
以下では、「いかに大変か」「なぜ大変か」「どのように大変か」を徹底的に具体的に解説します。
public class ApplicationManager { private Map<String, User> users; private DatabaseConnection db; private Logger logger; private GUI gui; private NetworkClient client; public void startApplication() { connectToDatabase(); loadUsers(); gui.showLoginScreen(); } public void processUserInput(String input) { logger.log("Input received: " + input); if (input.equals("logout")) { gui.showLoginScreen(); } else { client.send(input); } } // ... more than 5000 lines of code }
「曇らせ展開だけが続き旨味がないサンドバッグ要員」「他のHOと比較して活躍できるシーン量に大きな差があり、かつそれが事前に明示されない」「NPCの下位互換である」など。
自身が遊んだ感想、友人知人から口頭で聞いた話、某所にて書かれていた意見を未通過KPをする際のヒントとしてまとめています。複数意見があったものは併記しました。
あくまで個人の感想です。よりよいセッションのための参考程度でご覧ください。
(50音順)
HO1
HO3
HO2
全員
NPC中心
HO1
全体的に秘匿の意味を感じない
NPC中心
NPC中心
HO3が虚無りがち
HO1もいらない
HO3が虚無、全部虚無
HO2ややマシ
HO2は陣による
HO2
HO1
HO2もやや虚無
HO3
NPC中心
HO2
HO2
全員
HO3
HO3疎外感あり
HO1
HO4
HO2もやや虚無
全員
HO3
HO2
偏りありかつPL会議不可
HO4
HO4
HO3曇らせばかり
魔女は出目次第で虚無
偏りあり
NPC中心
HO2
HO4もやや虚無
HO3
HO2
HO3も不遇寄り
HO4
HO3
HO4
HO2も楽しくはない
NPC中心
陣により星、吊るされた男、愚者、女教皇、力、皇帝、魔術師、世界、節制など
HO3
NPC中心
NPCが主役
ハートがやや薄味
柳最優遇
桜と藤も出番あり
他は微妙
全員
全員自由度がない
色欲が一番薄い
午が後半虚無になりかねない
HO4
HO1
HO3
HO3
HO4も薄め
HO3
狗の役割を活かせないことはありうる
NPC中心
HO3
HO2も虚無より
HO1
ややNPC中心
HO1以外の全員
HO2はやや疎外感
HO1
HO2虚無
HO3救われない
HO2
HO2
HO1やや虚無
HO4
お助けNPCっぽい
HO2も虚無
哀
HO喜以外
HO2
HO4も虚無りがち
全員
HO5
HO2
HO3
HO2が一番虚無?
HO4も虚無
色欲強欲
怠惰も虚無より
NPC中心
野狗子
HO2
HO4
火力バランスが悪い
HO1
HO2もやや虚無
HO4
NPC中心
HO1
HO3
HO2
落語家も楽しくはない
あとワークエリアは流石にu8 buf[16]; とかしておいて
「(s16)(((s16*)buf)+0) は x で…+2 は y で…」なんてやってられないので
(snip)
とかで this = (HOGE)buf; してから this->x とか this->y とか にしたらだいぶ見た目がふつうになったンゴ!
(わかる人ならこれで大丈夫だと思うけど)いくらなんでも説明が雑すぎたので集合知のためにもう少し詳しく残しておきますね。
typedef struct { Map *map; s16 x, y; s16 n, c; s16 w, h; } TH_REGISTER_MAP, *TH_LPREGISTER_MAP; u8 g_pThisRegister[16]; void thDemo_WallpaperInit(void) { /* s16 *reg = (s16*)g_pThisRegister; *(reg + 0) = 0; *(reg + 1) = 0; *(reg + 2) = 256; *(reg + 3) = 160; **/ TH_LPREGISTER_MAP reg = (TH_LPREGISTER_MAP)g_pThisRegister; reg-> map = g_pMaps[1]; reg-> x = 0; reg-> y = 0; reg-> w = 256; reg-> h = 160; } void thDemo_WallpaperMain(void) { /* Map *map = g_pMaps[1]; TH_LPREGISTER_S16 reg = (TH_LPREGISTER_S16)g_pThisRegister; *(reg + 0) = *(reg + 0) + 1; *(reg + 1) = *(reg + 1) + 1; MAP_scrollTo(map, ((*(reg + 0)) % (*(reg + 2))), ((*(reg + 1)) % (*(reg + 3)))); **/ TH_LPREGISTER_MAP reg = (TH_LPREGISTER_MAP)g_pThisRegister; reg->x++; reg->y++; MAP_scrollTo(reg->map, (reg->x) % (reg->w), (reg->y) % (reg->h)); }
あなた様のおっしゃる通りに、法律で人の自由を縛ることにはもっと慎重であるべきだと猛省いたしました。
単なる土下座に留まらず、中国より古来から伝わる「三跪九叩頭の礼」を致します。
なお、冗長な記述を避けるためにJavaで記述させていただきます。
public static void main (String[] args){
for(int i=1; i<=3; i++) {
System.out.println("跪");
for(int j=1; j<=3; j++) {
System.out.println("起");
}
System.out.println("起立");
}
}
}
御清聴の程有難く存じます。
私は直接ウェブ検索を行うことはできませんが、あなた自身で関連するキーワードで検索エンジンを使用することができます。以下は、検索する際に使えるキーワードの例です:
"cloud smoke vortex art"
"mysterious swirling cloud illustration"
"smoke entering vortex central light"
"fantasy cloud swirl center"
"artistic representation of smoke entering central void in clouds"
これらのキーワードを使用して検索すると、あなたが表現しようとしているイメージに近いアートやイラストが見つかる可能性があります。画像検索結果から、目的に合ったものを見つけることができるでしょう。
横じゃが、こんな感じでいいんかね?ChatGPTじゃなくてBing先生だが同じ事やろ
わいの問:
今週の水曜日の日付を出力するJavaコードを教えてください。
import java.time.LocalDate; import java.time.DayOfWeek; import java.time.format.DateTimeFormatter; public class Main { public static void main(String[] args) { // 現在の日付を取得 LocalDate today = LocalDate.now(); // 今週の水曜日の日付を取得 LocalDate wednesday = today.with(DayOfWeek.WEDNESDAY); // 日付をフォーマットして出力 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); System.out.println(wednesday.format(formatter)); } }
(動かしてはないけど、まあパッと見でおかしい所は無さそうやし、動くやろ。。。)
もうこのやりとりの時点でダメやん?
ダメじゃねえよ。要件を正確に記述できないならコードなんて書けるわけない。
空気読んでいい感じに読み取ってよというのを求めてるなら、仕様書すら書けないダメプログラマーってことだろ。
コンピューターの中では数字で日付は管理されててそれはJavaでは日付のオブジェクトとして表されるんだけど、「今週=現在の週の水曜日」を表すオブジェクトが欲しい
やったぞ
java.time パッケージの LocalDate クラスや TemporalAdjusters クラスを使用して、「今週の水曜日」の日付オブジェクトを取得できます。
以下のコードは、現在の日付に基づいて今週の水曜日の LocalDate オブジェクトを返す Java の関数です。
import java.time.temporal.TemporalAdjusters;
public static void main(String[] args) {
System.out.println(getThisWeeksWednesday());
}
public static LocalDate getThisWeeksWednesday() {
LocalDate today = LocalDate.now();
return today.with(TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY));
}
}
この関数は現在の日付を取得し、それを TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY) メソッドに渡して、今週の水曜日の日付を取得します。今日が水曜日である場合、それが返されます。それ以外の場合は、次の水曜日の日付が返されます。
今日が週内のどの日であったとしても(木曜日や金曜日であったとしても)その週の水曜日を表すオブジェクトを返す関数を示してください。
それには、今週の最初の日を求め、そこから水曜日までの日数を加算するアプローチを使用します。以下のコードでは、週の最初の日を月曜日と仮定しています:
import java.time.temporal.TemporalAdjusters;
public static void main(String[] args) {
System.out.println(getThisWeeksWednesday());
}
public static LocalDate getThisWeeksWednesday() {
LocalDate today = LocalDate.now();
LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
return monday.plusDays(2);
}
}
このコードは、まず今日の日付を取得し、それから TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY) メソッドを使用して今週の月曜日の日付を取得します。そして、月曜日から2日後の日付(水曜日)を取得するために plusDays(2) メソッドを使用します。
VOID通ったいま、ちょっと前にVOIDのHO2とHO4は人間そっくりな見た目のアンドロイドで来るべきだしあまりにも人間離れしてメカメカしい見た目はKPが止めるべきって言ってやや燃えてたふせったー思い出したなあ。
通過した今はその意見ちょっと分かるんだけど未通過ではそんなの分かるわけないし、KPだってぴくるーの仮置きイラストでオッケー出したら当日全然メカで来た、とかもありえるだろうし難しいなあ。金出して立ち絵依頼してきてたり、時間かけて自分で描いてたりするだろうし、そこでいやだめですピクルーの絵でやってください、とは言えない。
VOIDってなんか近未来のかっこいい戦闘できる有名シナリオ!と思ってあなたはアンドロイドですって言われたらそりゃあ『ぼくのかんがえたさいきょうのあんどろいど』作ってきちゃうよなあ。
バンド名: Shadowrealm
アルバムタイトル: Apocalypse Chronicles
説明: このアルバムは、終末、死生観、地獄など、深いテーマに基づいた曲で構成されています。"Apocalypse Chronicles"は、世界が滅亡に向かう物語を表現しており、バンド名の"Shadowrealm"は、深く謎めいた世界観を表現しています。
この曲は、人類の終末時について歌っています。悲惨な状況にある人々が、最後の希望として再び希望を見つけ、力を取り戻すために戦う物語です。
神の怒りが地上に降り注ぎ、人間たちは絶望に陥ります。この曲は、神の正義と償いについて歌っています。
地獄の火が全てを焼き尽くす世界を表現しています。曲の中では、この火に包まれた者たちが、激しい苦痛に耐えながら、絶望とともに永遠に生きることを歌っています。
不死の戦士たちが集い、戦いの準備を始めます。曲の中では、彼らが魔法と剣で敵を倒し、最終的に勝利を手にする姿が描かれています。
死後の世界で待ち受ける謎めいた影たちが、死者を誘惑していきます。この曲は、死生観について考えるきっかけを与えるような深い世界観が表現されています。
黒魔術を使う霊能者の支配する世界を描いた曲です。彼の魔法によって、死者たちが蘇り、地上に畏怖の念を与えます。
地獄に落ちた魂たちが、一つにまとまり、軍団を作り出す様子が描かれます。曲の中では、彼らが地上に攻め込み、人々を苦しめる様子が描かれています。
何もない虚無の世界に取り残された人々が、自分たちの存在意義を問いかけます。この曲は、生と死、善と悪、そして存在意義についての深い哲学的思考が表現されています。
あれ見てちょっとでも面白いと思った人とはもう会話できる気がしないんだよな。
1カット1カット全てがダメというかマジで何も伝わってこないというか
これ絶対何も言いたいことない人拘りとかなんもない人が中核になって作ってる。
それがもう全体に現れてるので1クールどころか初回1話全部どころか
1話の序盤3分ぐらいで見るに耐えなくてオエッとなる。
不味いというより味がなんもしない。
薄め過ぎたジュース飲まされてるような感じ。
勿論ちゃんと全部見て理屈っぽく一個一個ダメさ説明しようとしたら出来るけど
そこまでする元気もわかないというかそこまでする値打ちが無いというか。
だからわかってほしいんだけど
作品のどこかが思想的に気に入らないとかそういう内容のある嫌悪やアンチ感情じゃなくて
単純にこれ薄めたジュースだろって意味でこんなもんがテレビで流れてるのが信じられないんだよな。
でも俺が見た限り作画がいいところなんか一個もない。
https://www.youtube.com/watch?v=A6UVAzUM-uo
たまたまつべで出てきた後半の方の切り抜きで見せ場のアクションだと思うけどすげーだろこれ。
どういう奴がレイアウト切ってるんだ。クリエイティブってナニ?って聞きたくなる。
上手いとか下手とか言うより虚無を感じる。なんなんだこれ?なんなんだこれ?
(百合どころかメイン2人に限らず全てのキャラの会話や感情がなんも無いように俺には見えるが。)
こんなに本当の意味で虚ろというかnullというかvoidというか
こんなもん見て何も感じないのか?異様さを感じないのか?
「変な味がする」どころじゃねーぞこれは。わからないのか?
不正解でscore += 0; と書いているのは静的解析がelse節を省略すると指摘してくるから。
何もしていない、はそのとおり。
不等号がいい具合に化けてるのでそのままにしておく。
import java.util.*; public class Main { public static void main(String[] args) { // 入力のparse (中略:int numに問題の数、String list[i][] に問題のリストを格納している) // 採点 int point = 0; for (int i = 0; i < num; i++) { String question = list[i][0]; String answer = list[i][1]; if (question.equals(answer)) { // 完全一致 point += 2; } else { if (question.length() == answer.length()) { // 文字数は等しい(部分点の可能性がある) point += scoring(question, answer); } else { // 不正解 point += 0; } } } System.out.println(point); } // 長さが同じ文字列を採点する // 長さが違う文字列を受け渡したときは正しく動作しない private static int scoring(String question, String answer) { int length = question.length(); int score = 2; for (int i = 0; i < length; i++) { (中略:文字が違うたびにscoreを-1して、socreが0以下になったらそのままreturn) } return score; } }
自動で安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋)
/**************************************
以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>
//CSVファイルが置かれてるディレクトリのパス。投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";
'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';
//ファイルのパス。CSVは絶対パスで、拡張子も必要。iimは相対パスでよく、拡張子不要。
const FILE_PATHS = {
textCsv: CSV_DIR + 'textNoAnker.csv',
//レス用投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。
replyTextCsv: CSV_DIR + 'textReply.csv',
};
baseWaitTime: 5,
//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ
waitTimeRange: 5,
//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)
waitTimeForAvoidingPunishment: 60 * 30,
//メール
mail: 'sage',
//名前設定
name: '',
//以下、偽装ワッチョイ設定。浪人でワッチョイを非表示にしてるときだけtrueにしてね。
//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。
//妙なニックネームの後に付く8桁の文字列をランダムで決めて付加するかどうか。
},
//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。
//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrueの場合、投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。
//最初に取得するアンカー無し投稿文CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力。
noAnkerPostTextCsvStartRow: 1,
//最初に取得する返信用投稿文CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力。
//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。
//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。
minAnker: 895,
//返信する場合、名前に以下の文字列を含む投稿にアンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列で複数指定可能。指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能。
//↑とは逆に、名前に以下の文字列を含まない投稿にアンカーをつけて返信する。↑と併用も可能。
//返信する場合、本文に以下の文字列を含む投稿にアンカーをつけて返信する。
filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演で擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],
},
//自分のIPアドレスの確認。VPNとかでIPを変更してマクロを動かしてるとき、突然VPNが作動しなくなってIPが元に戻ったときにマクロを止めるためのもの。
//以下の文字列が自分の現在のIPアドレスに含まれている場合、マクロを一時停止する。基本的に自分の本当のIPアドレスを入力。
},
//浪人設定。最後に動作を確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないから確認できずわからない。
//浪人にログインしてるかどうかをチェックするかどうか。trueならする。falseならしない。trueにしていてもし浪人にログインしていないことを確認したらログインしにいく。
password: '1234',
},
};
/**************************************
設定箇所終わり。
https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>
/**************************************
・NULL演算子(??)は使えない。論理積(&&)は使える。
・オブジェクトの分割代入はできない。
・importはできない。 <h3>o- *************************************/</h3>
/**************************************
関数 <h3>o- *************************************/</h3>
/**
* ここから始まる。
*/
checkSettings();
var _TextCsvCursors = new TextCsvCursors(
SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0
? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1
: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
SETTINGS.postSettings.replyPostTextCsvStartRow > 0
? SETTINGS.postSettings.replyPostTextCsvStartRow - 1
: SETTINGS.postSettings.replyPostTextCsvStartRow,
SETTINGS.postSettings.textCsvLoop,
),
);
var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);
const _MyPosterName = new MyPosterName({
name: SETTINGS.nameSettings.name,
});
const _ThreadUrl = openPromptThreadUrl();
//ループ
while (true) {
SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();
//スレを開く
openUrl(_ThreadUrl.fullUrlHttps());
//浪人にログインする設定なら、浪人にログインしているかどうかを確認し、していなければログインしにいく。
if (SETTINGS.roninSettings.checkLogin) {
}
}
if (SETTINGS.postSettings.replyPost) {
const targetAnkerNumber = createPostDOMList()
.filterPostnumberHigher(_LoopStatuses.currentMinAnker())
.filterByPostername(SETTINGS.postSettings.filterNames)
.filterByPosternameNotIncluded(
SETTINGS.postSettings.filterNamesNotIncluded,
)
.filterByText(SETTINGS.postSettings.filterText)
if (targetAnkerNumber !== null) {
const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);
messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);
return {
...r,
updatedLoopStatuses:
_LoopStatuses.updateMinAnker(targetAnkerNumber),
};
}
}
if (SETTINGS.postSettings.noAnkerPost) {
//返信対象無し、或いは返信しない設定の場合。アンカー無し投稿文を作る。
const r = _TextCsvCursors.takeNextRowTextAsNoAnker();
messageDisplay('返信対象無し。アンカー無し投稿。');
return {
...r,
updatedLoopStatuses: _LoopStatuses,
};
}
return null;
})();
if (p) {
//投稿。
nickname: SETTINGS.nameSettings.nickname,
korokoro: SETTINGS.nameSettings.korokoro,
area: SETTINGS.nameSettings.area,
}),
SETTINGS.mail,
p.text,
);
//_TextCsvCursorsと_LoopStatusesを更新。
_TextCsvCursors = p.updatedTextCsvCursors;
_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
} else {
`返信対象が現われるのを待機中...。`,
`投稿回数: ${_LoopStatuses.currentPostCount()}`,
`minAnker: ${_LoopStatuses.currentMinAnker()}`,
`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,
`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,
]);
}
wait(SETTINGS.baseWaitTime + randomRange(0, SETTINGS.waitTimeRange));
}
}
/**
* 投稿処理と投稿結果を見てリトライしたりマクロ終了したり。
* @param {string} serverName サーバー名
* @param {MyPosterName} _MyPosterName
* @param {string} postMail メール
*/
serverName,
postMail,
_MyText,
retryTimes = 0,
) {
const r =
retryTimes === 0
? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(
postTo5chTread,
)
serverName,
postMail,
_MyText,
).postSubstring(retryTimes, postTo5chTread, postConfirm);
if (r) {
back();
return;
}
wait(7);
const error = createPostErrorMessage().analyze();
messageDisplay(error.message);
if (error.order === 'KILL') {
kill();
} else if (error.order === 'SKIP') {
return;
} else if (error.order === 'TRUNCATE') {
back();
serverName,
postMail,
_MyText,
retryTimes + 1,
);
} else if (error.order === 'WAIT') {
wait(SETTINGS.waitTimeForAvoidingPunishment);
serverName,
postMail,
_MyText,
retryTimes,
);
} else if (error.order === 'LOGIN') {
serverName,
postMail,
_MyText,
retryTimes,
);
}
return;
}
/**
* 現在のIPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。
* @returns
*/
function checkCurrentIpNotTheIp() {
openUrl('https://www.cman.jp/network/support/go_access.cgi');
const _IpAdress = createIpAdressFromCMan();
if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {
pause('現在のIPに指定した値が含まれていることを確認。');
}
return;
}
/**
* @returns
*/
if (
SETTINGS.postSettings.noAnkerPost === false &&
SETTINGS.postSettings.replyPost === false
) {
return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&
SETTINGS.postSettings.replyPostTextCsvStartRow < 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',
);
}
if (
SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||
SETTINGS.postSettings.replyPostTextCsvStartRow === 0
) {
return kill(
'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',
);
}
}
/**
* 入力フォームを表示して入力されたスレのURLを受け取る。
*/
function openPromptThreadUrl() {
const url = prompt('スレURLを入力');
}
/**
* 開いてるスレのレス全て読み取ってPostListインスタンスを作って返す。
* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。
*/
const posts = window.document.getElementsByClassName('post');
return new PostList(Array.from(posts).map((e) => new Post(e)));
}
/**
* 開いてるスレのレス全て取得してPostDOMListに格納して返す。
* @returns
*/
function createPostDOMList() {
const posts = window.document.getElementsByClassName('post');
for (let index = 0; index < posts.length; index++) {
//HTMLCollectionからElementを1つずつ抽出して配列に。
arrPostDOMList.push(posts.item(index));
}
return new PostDOMList(arrPostDOMList);
}
/**
* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。
*/
function createPostErrorMessage() {
window.document
Steamで買った『Recursed』というゲームを全ステージクリアしたので、記念に感想を書く。
Steam:Recursed
https://store.steampowered.com/app/497780/Recursed/?l=japanese
一見すると『Recursed』は2Dのレトロな雰囲気のアクションゲームである。操作はシンプルで、方向キーで左右に移動し、アクションはジャンプと物をつかむ/投げるだけだからだ。部屋の中を移動してブロックをつかんで足場を作ったり、鍵をつかんで扉を開錠したりしてゴールへと到着(crystalを獲得)すればステージクリアだ。
ステージの始めはチュートリアルの様に簡単だが、ステージを経るごとに難しくなり、そのうち何度も試行錯誤したり難しさのあまり何十分も頭を抱えたりもした。
この複雑さを生み出す要因は箱(ゲーム中表記ではChest)である。このゲームでは箱の中へジャンプすることで部屋の内に入れるが、一度箱の外にでると箱の内部状態はリセットされてしまうのだ。よって箱の中にブロックや鍵などのオブジェクトを持ち込んでも保存することはできないし、ブロックの位置もリセットされるし、開錠した扉もまた施錠されてしまうことになる。
さらに大きな特徴として、箱を持ち歩いて移動することができるのだ。それにより、箱を持ったまま別の箱に入ったり箱を持って箱の外にでることもできる。
そして、ステージを経ると箱の中の部屋は箱の外と同じ部屋という場面に出くわす。Recursedは『再帰呼び出し』という意味らしいが、まさにこのゲームのタイトル通りの現象が起こるのだ。そして、以降のステージでは再帰を交えることでパズルの複雑さはより深まっていく。
再帰は数学的帰納法やアルゴリズムでは定番の概念だが、それがパズルとなってプレイヤーの思考回路を奪ってくる。私はかつて社畜プログラマとしてJavaプログラミングを経験していたので、箱に入ることはメソッドを呼び出すことの様に感じた。オブジェクトを持って箱に入ることは引数を使ってメソッドを実行することであり、オブジェクトを持って箱の外に出ることはreturn文でメソッドを終わらせることであった。
「ゴール前の段差が大きくブロックが必要だから、ブロック生成メソッドを呼び出してブロックオブジェクトを返り値として渡さなくてはいけないけど、そうすると鍵オブジェクトをゴールメソッドの引数として渡すことができなくて……、いっそのこと、ブロックメソッド内からゴールメソッドを呼び出すべきか……、メソッドの返り値は一つだけだが何度も呼び出せばいけるか? この緑色のオーラはなんだ? Staticを意味するのか? Staticなオブジェクトの位置情報をあらかじめ変更しておけば、ゴールメソッドで引数渡しをする必要がなくなるのか?」
こんなことを一つのステージをクリアするだけのために何十分も考えていたのだ。念のために書いておくが、ゲーム内には数学用語やプログラミング用語は一切出てこない。ただ単に、私にJavaプログラミングの経験があるからその用語でパズルを考えていただけだ。ゲーム内で箱から出入りしたりオブジェクトを箱の中から出し入れするとどうなるかを、Eclipseでステップ実行するように想起していた。ちなみに、ゲーム内で存在しない部屋や壁の中に移動しようとするとparadoxが発生して強制的に特殊な部屋へ移動されるが、私はその度にステップ実行でExceptionに遷移されたことの様に感じた。他の言語に精通するプログラマだったり数学畑の人ならば、私とは異なる概念でパズルを思考をするのだろうか。
プログラマを辞めて何年もプログラミング的思考をしてこなかった私でも全ステージクリアすることができたのだから、学校でプログラムを学んでいたり現役でプログラミングをしてきた人ならばこのゲーム『Recursed』をクリアすることは可能だろう。いっそのこと、『Recursed』のクリアすらできない人にプログラミングができるのか? と煽ってみたいくらいだ。
ちなみに、もし私が社畜プログラマ時代にこのゲームをやったらブチ切れていただろう。なんで仕事でプログラミングで脳を酷使した上に自宅のゲームでも同じようなプログラム的な思考をしなければならないんだよと。プログラミングから何年も離れていた今の私にとって『Recursed』は、プログラミングや単体テストが無事成功した時の快楽を思い出させるものだった。
『Recursed』はパズルとしての難易度は非常に高いが、理不尽な解法を求められることはない。理不尽な解法のクイズやパズルには怒りが湧いてくる。ひと昔前のクイズ番組を見たことのある人なら『モヤッとボール』を投げつけたくなる、と言えばその感情が伝わるだろう。『Recursed』はどんなに難しいステージでも、ただただ開発者のパズル作成能力に感嘆するだけで怒りは湧いてこない。
似たようなアクション風パズルゲームとして有名なのは『The Witness』であろう。『The Witness』も私が好きなパズルゲームであり、ゲームとして高い評価を得ていることに間違いはないのだが、しばしば理不尽な解法を求められるパズルがありその度に私は怒りが湧いてきたものだ。そう考えると、『Recursed』はパズルとしての洗練さだけなら『The Witness』を超えるものだと私は思う。
具体的にパズルを解説するととただのネタバレになってしまうので(もっとも、文字だけでパズルの解法を説明できないのだが)、『Recursed』で私が好きなステージを述べる。順番は攻略順に並べた。
チュートリアルの様に簡単だったこれまでのステージから突如再帰の概念を見せつけられることで、このゲームのタイトル名の意味を理解することになった。
鍵を手に入れたら扉に到達できず、先に扉に到達したら鍵が手に入らずで、まさにインターロックの名前に相応しいステージだった。
一画面だけのオブジェクトが少ないシンプルなステージだが、氷の壁に阻まれてゴールできず苦戦した。試行錯誤の繰り返しの末クリアできたが、何故クリアできたのかがわからない。
The Voidのステージはどれもこれまでの集大成という感じでやりごたえあったが、中でも頭をひねらせたのがこれ。ゴールの部屋を水没させたり水の無い状態で入ったりして鍵を運搬するのに苦労した。
箱を左右へ投げて移動を繰り返して、高い位置にあるゴールを目指すのがまさにEscalateというステージ名そのものだった。paradoxを発生した後のパターンが複雑だったのが印象に残っている。paradoxを発生させたらcrystal獲得(通常のクリア)できないのかよ……という落胆は大きかった。しかし、それだけにcrystal獲得とdiamond獲得(paradox発生によるクリア)のどちらも大きな達成感を得られた。
簡単そうに見えて難しく、唯一ステージを飛ばして次のステージへと進んだので印象に残っている。後に複数日に及ぶ数時間の試行錯誤で改めてこのステージをクリアができて、クリアにかかった時間が最も長くなったステージでもある。しかしながら、おそらく開発者の想定外の方法でのクリアであり。初期画面から右の方へ一切行かずにOobleckさえ使用しないというクリア方法にスッキリしなかった。といっても、開発者の想定を無視するゴリ押し的なクリアを見つけたのはこのステージだけだった。
The Void/Escalateと似たコンセプトのステージだが、釜(JavaにおけるThread?)のギミックを利用したより複雑な構成となっている。高い位置にあるゴールを目指すのは、やはりFlightというステージ名そのものだった。
この記事を投稿する前にエンディングを見れていないことに気づいた。
全ステージクリア(全てのCrystal取得)したからと、この記事を執筆するためにネタバレを気にせず攻略情報を調べていたけど、エンディングなんてわかる訳ねえよ。The Void/Trilemmaの最後にCrystal取得とは関係ない意味深なオブジェクトがあることには気づいていたけど……。ちなみに、私のSteam実績によるとdiamondとrubieの全取得はできてないけれども、もう取得する気力はない。パズルゲームガチ勢にとっては、実績全解除を目指さない私は軟弱者に映るのだろうか? 攻略を調べずに実績全解除できる人は、高い論理的思考能力を有しているに違いない。