点Nの軌跡

競プロの話または日記

Cookie Clicker(ブラウザ版)の配色が気に食わない

OBが1人で3枠は取りすぎな気がしますが、記事が余ってた&カレンダーが23:30時点でまだ空いてたので呉高専アドベントカレンダー 5日目に放流します。呉高専なーんも関係ない短編です。

ネタバレを多く含みますのでご注意ください。

Cookie Clickerの説明は省きます。知らない人はまずここにアクセスして遊んでください:https://orteil.dashnet.org/cookieclicker/

僕は攻略wikiは見るけどゲームを有利に進めるmodは入れない立場です。なのでmodには基本消極的なのですが…

ゲームを進めていくと遊べるstock marketというミニゲーム、その配色がどうも気に食わないのです。

気に入らない配色

valueが安いときに買って高いときに売るってだけなのですが、どれが安くてどれが高いのかマジで分かりません。

この配色を、modで変更します。こんな感じ。

こっちのほうがまだいい

背景色とかをいい感じにするほうがいい気がしますが、とりあえずこれでひとつ。

0: Cookie Clickerのmod

ブラウザのブックマーク機能を使い、ブックマークレットを実行することで実現します。

1: 値段に応じてpriceの色を変化させる

stock marketの各アイテムの情報はGame.Objects.Bank.minigame.goods[?]を見ます。wikiにある計算式に基づいて標準価格を計算し、その0.5倍から2倍にかけてpriceの色を赤から緑に変化させていきます。プレイしている感じ、あまりよい色の付け方ではないです。安いものは5倍ぐらい振れるし高いのは1.5倍にすらならないので。あとfff4f4とかfafff4とか人の目じゃ分からないです。

// 赤<-> 緑
let rgAry = ["#ff0000","#ff2b2b","#ff5555","#ff8080","#ffaaaa","#ffd5d5","#ffeaea","#fff4f4","#ffffff","#fafff4","#f4ffea","#eaffd5","#d5ffaa","#bfff80","#aaff55","#95ff2b","#80ff00"];
for(let [key,val] of Object.entries(Game.Objects.Bank.minigame.goods)){
  let price=val.val; // 現在の価格
  let center=10+val.id*10+Game.Objects.Bank.level-1; // 標準価格
  let left=center/2; // の半分
  let right=center*2; // の倍
  if(center < price){ // 高い
    let d=Math.min(8,Math.floor(8*(price-center)/(right-center))); // 1倍~2倍を8段階に分けた時、どれぐらいか
    val.valL.style.color=rgAry[8+d]; // 高いほど緑
  }
  else if(price < center){ // 安い
    let d=Math.min(8,Math.floor(8*(center-price)/(center-left))); // 0.5倍~1倍を段階づける
    val.valL.style.color=rgAry[8-d]; // 安いほど赤く
  }
}

2: 在庫があるときの色は緑から黄色に

価格表示に緑を使う関係から、在庫があるときのstockの色が緑だとまずいです。黄色にします。在庫が0になったら元の薄い白に戻すのも忘れずに。

if(val.stock!==0){
  val.stockBoxL.style.color = "#ffff00"; // 黄色
}
else{
  val.stockBoxL.style.color = "#ffffffb3"; // デフォルト
}

3: 隠し実績

Third-partyという隠し実績があり、特定のmodを入れると解除されます(通常プレイで使われない実績解除コマンドがmod内で叩かれてるってだけで、やろうと思えば開発者モードからの解除も可能なのですが。)。せっかくなので解除します。

if(Game.Achievements['Third-party'].won==0){
  Game.Win('Third-party');
}

4: 以上をまとめて毎秒更新

stock marketの情報は時々刻々変化するので一定時間で更新します。1秒に1回で十分です。

setInterval(
  function(){
    // ここに1-3の内容を書くことで毎秒実行される
  }
  ,1000
);

全体

setInterval(
  function(){
    if(Game.Achievements['Third-party'].won==0){
      Game.Win('Third-party');
    }
    if(Game.Objects.Bank.minigameLoaded){
      let rgAry = ["#ff0000","#ff2b2b","#ff5555","#ff8080","#ffaaaa","#ffd5d5","#ffeaea","#fff4f4","#ffffff","#fafff4","#f4ffea","#eaffd5","#d5ffaa","#bfff80","#aaff55","#95ff2b","#80ff00"];
      for(let [key,val] of Object.entries(Game.Objects.Bank.minigame.goods)){
        let price=val.val;
        let center=10+val.id*10+Game.Objects.Bank.level-1;
        let left=center/2;
        let right=center*2;
        if(center < price){
          let d=Math.min(8,Math.floor(8*(price-center)/(right-center)));
          val.valL.style.color=rgAry[8+d];
        }
        else if(price < center){
          let d=Math.min(8,Math.floor(8*(center-price)/(center-left)));
          val.valL.style.color=rgAry[8-d];
        }

        if(val.stock!==0){
          val.stockBoxL.style.color = "#ffff00";
        }
        else{
          val.stockBoxL.style.color = "#ffffffb3";
        }
      }
    }
  },
  1000
);

5: 使う

ネットにアップして、ブックマークレットを作成します

javascript:(function(){Game.LoadMod('httpsから始まるmodソースファイルの場所.js');}());

これをブックマークしてゲームを開いているタブで開けばok

javascript:(function() {Game.LoadMod('https://pointn.github.io/cookiepricecheck/cookiepricecheck.js');}());