Patch - solaris0115/RimWorldModGuide GitHub Wiki

ํŒจ์น˜ ํ•จ์ˆ˜

๊ธฐ์กด์˜ ํ•จ์ˆ˜์— ์ ‘๊ทผ, ์ œ์–ดํ•˜๋Š” ํ•˜๋ชจ๋‹ˆ ํ•จ์ˆ˜๋“ค์„ ํŒจ์น˜ ํ•จ์ˆ˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
ํŒจ์น˜ ํ•จ์ˆ˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†์„ฑ์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
[HarmonyTargetMethod], [HarmonyPrepare], [HarmonyPrefix], [HarmonyPostfix], [HarmonyTranspiler]

TargetMethod(), Prepare(), Prefix(), Postfix(), Transpiler()

TargetMethod

๋ฏธํ™•์ธ

Prepare

๋ฏธํ™•์ธ

Prefix

Prefix๋Š” ๊ธฐ์กด์˜ ํ•จ์ˆ˜ ์ด์ „์— ๋จผ์ € ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
Prefix๋Š” ๋‘๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. void์™€ bool
bool๋กœ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ์šฐ ๋ฐ˜ํ™˜๊ฐ’์— ๋”ฐ๋ผ ๊ธฐ์กด์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
true ์ผ๊ฒฝ์šฐ ๊ธฐ์กด์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  false์ผ ๊ฒฝ์šฐ ๊ธฐ์กด์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Postfix

Postfix๋Š” ๊ธฐ์กด์˜ ํ•จ์ˆ˜ ์ดํ›„์— ์‹คํ–‰ ๋ฉ๋‹ˆ๋‹ค.
Postfix๋Š” void ํ˜•ํƒœ๋งŒ ๋ฐ˜ํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Transpiler

Transpiler๋Š” C# ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์ธ IL์„ ํ†ตํ•ด ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๊ต์ฒดํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ํ•จ์ˆ˜์—์„œ์˜ ๋ช…๋ น์–ด ์„ธํŠธ๋ฅผ ๋ถ€๋ถ„์  ์ˆ˜์ •,๊ต์ฒด,์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Patch ์ง€์นจ

Prefix์™€ Postfix ๋ชจ๋‘ ์›๋ณธํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋  ํŒŒ๋ผ๋ฉ”ํ„ฐ์™€ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ํŒŒ๋ผ๋ฉ”ํ„ฐ์™€ ํŒจ์น˜ํ•  ํด๋ž˜์Šค์— ์ ‘๊ทผ์„ ํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™๋“ค์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํŒจ์น˜ํ•จ์ˆ˜๋Š” staticํ˜•ํƒœ์˜ ํ•จ์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Prefix์˜ ๋ฐ˜ํ™˜ํ˜•์€ void ๋˜๋Š” bool ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Postfix๋Š” voidํ˜•ํƒœ์˜ ๋ฐ˜ํ™˜๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํŒจ์น˜ํ•  ํด๋ž˜์Šค๊ฐ€ staticํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ __instance๋ผ๋Š” ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•˜์…”์•ผ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ’์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด์˜ ๊ฒฝ์šฐ ๊ฐ’์ „๋‹ฌ์—์„œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด refํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ref ํ‚ค์›Œ๋“œ์™€ __result๋ฅผ ์‚ฌ์šฉ ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.(ํด๋ž˜์Šค ํƒ€์ž…์ด๋˜, ๊ตฌ์กฐ์ฒด๋˜)
  • ํŒจ์น˜ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋Š” ๊ธฐ์กด ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋“ค์„ ๋ชจ๋‘ ์„ ์–ธํ•  ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. (์•ˆํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.)
  • ๋งŒ์•ฝ ๊ธฐ์กด ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒจ์น˜ ํ•จ์ˆ˜์— ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ช…๊ณผ ํƒ€์ž…์„ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•˜๊ฒŒ ํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒจ์น˜ ํ•จ์ˆ˜๋Š” ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ ์ผ๋ฐ˜ ํ˜น์€ refํ˜•์‹์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Transpilers์—๋Š” 2๊ฐ€์ง€ ์„ ํƒ์  ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • MethodBase๋Š” ํŒจ์น˜๋œ ๊ธฐ์กด์˜ ํ•จ์ˆ˜ ๊ทธ ์ž์ฒด์ž…๋‹ˆ๋‹ค.
  • IEnumerable<CodeInstruction>๋Š” ๊ธฐ์กด ํ•จ์ˆ˜์—์„œ ์‹คํ–‰๋˜๋Š” ๋‚ด๋ถ€ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ

๋‹ค์Œ ์˜ˆ์ œ๋“ค์„ ํ†ตํ•ด ๊ฐ๊ฐ ํŒจ์น˜ ํ•จ์ˆ˜๋“ค์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์“ฐ์ด๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ๋  ํด๋ž˜์Šค๋Š” BiomeWorker_Desert๋กœ ์„ธ๊ณ„์ง€๋„์—์„œ ์‚ฌ๋ง‰ ์‹์ƒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ BiomeWorker์—์„œ ์ƒ์†๋ฐ›์€ GetScoreํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๋ฐ”์ด์˜ด๋“ค์€ ๊ฐ ํƒ€์ผ๋กœ๋ถ€ํ„ฐ ์‹์ƒ์„ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๊ธฐ์กด ํ•จ์ˆ˜ ๋ฏธ์‹คํ–‰, ํ•ด๋ฐœ๊ณ ๋„ 600์ดํ•˜ 0์ด์ƒ, ๊ฐ•์ˆ˜๋Ÿ‰ 300์ดํ•˜์ผ ์˜จ๋„๋Š” 35๋„ ์ด์ƒ์ผ๋•Œ๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ํŒจ์น˜ ํ˜•ํƒœ๋ณ„๋กœ ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด ํ•จ์ˆ˜

  • BiomeWorker_Desertํด๋ž˜์Šค๋Š” Static ํด๋ž˜์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰ ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ BiomeWorker_Desert์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ผ์ด ์žˆ๋‹ค๋ฉด BiomeWorker __instanceํ˜น์€ BiomeWorker_Desert __instance๋ผ๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.[์—ฌ๊ธฐ์„  ์•„๋‹™๋‹ˆ๋‹ค.]
  • GetScoreํ•จ์ˆ˜๋Š” Tileํƒ€์ž…์˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๊ณ  ๊ทธ ์ด๋ฆ„์€ tile์ž…๋‹ˆ๋‹ค. ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • GetScoreํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ํ˜•์€ floatํƒ€์ž… ์ž…๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์„ ์ž„์˜ ์ง€์ •ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด float __result๋ฅผ ํฌํ•จํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
//RimWorld.BiomeWorker_Desert 
public class BiomeWorker_Desert : BiomeWorker
{
    public override float GetScore(Tile tile)
    {
        if (tile.WaterCovered)//ํ•ด๋ฐœ ๊ณ ๋„ 0์ดํ•˜๋ฉด -100์ 
        {
            return -100f;
        }
        if (tile.rainfall >= 600f)//๊ฐ•์ˆ˜๋Ÿ‰์ด 600์ด์ƒ์ด๋ฉด 0์ 
        {
            return 0f;
        }
        return tile.temperature + 0.0001f; //์˜จ๋„+0.0001์ ์„ ๋ฐ˜ํ™˜
    }
}

Prefix

  • ๊ธฐ์กด ํด๋ž˜์Šค์—์„œ์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ์œผ๋กœ __instanceํŒŒ๋ผ๋ฉ”ํ„ฐ๋Š” ์ œ๊ฑฐ
  • GetScore์˜ ๋ฐ˜ํ™˜๋˜๋Š” floatํƒ€์ž…์˜ ์ ์ˆ˜๋กœ ๋ฐ”์ด์˜ด์ด ์ฑ…์ •๋จ์œผ๋กœ __result์„ ํฌํ•จ
  • Tile tile์˜ ๋ฉค๋ฒ„๋ฅผ ์ ‘๊ทผํ•˜์—ฌ ์กฐ๊ฑด๊ฒ€์‚ฌ๋ฅผ ํ•ด์•ผํ•จ์œผ๋กœ ํฌํ•จ
  • ๊ธฐ์กด ํ•จ์ˆ˜๊ฐ€ ๋ฏธ์‹คํ–‰ ๋˜๊ธฐ ์›ํ•จ์œผ๋กœ boolํƒ€์ž…์˜ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ›„ return ๊ฐ’์€ false
[HarmonyPatch(typeof(BiomeWorker_Desert))]
[HarmonyPatch("GetScore")]
[HarmonyPatch(new Type[] { typeof(Tile) })]
internal class DesertBiome_Patch
{
    static bool Prefix(ref float __result,Tile tile)
    {
        if ((tile.elevation>600)||(tile.elevation < 0))//ํ•ด๋ฐœ๊ณ ๋„ 600์ดˆ๊ณผ 0๋ฏธ๋งŒ
        {
            __result= - 100f;
            return false;
        }
        if (tile.temperature <35 )//๊ฐ•์ˆ˜๋Ÿ‰์ด 600์ด์ƒ์ด๋ฉด 0์ 
        {
            __result= 0f;
            return false;
        }
        __result= tile.temperature + 0.0001f; //์˜จ๋„+0.0001์ ์„ ๋ฐ˜ํ™˜
        return false;//false์ž„์œผ๋กœ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋Š” ๋ฏธ์‹คํ–‰๋จ.
    }
}

Postfix

  • ๊ธฐ์กด ํด๋ž˜์Šค์—์„œ์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ์œผ๋กœ __instanceํŒŒ๋ผ๋ฉ”ํ„ฐ๋Š” ์ œ๊ฑฐ
  • GetScore์˜ ๋ฐ˜ํ™˜๋˜๋Š” floatํƒ€์ž…์˜ ์ ์ˆ˜๋กœ ๋ฐ”์ด์˜ด์ด ์ฑ…์ •๋จ์œผ๋กœ __result์„ ํฌํ•จ
  • Tile tile์˜ ๋ฉค๋ฒ„๋ฅผ ์ ‘๊ทผํ•˜์—ฌ ์กฐ๊ฑด๊ฒ€์‚ฌ๋ฅผ ํ•ด์•ผํ•จ์œผ๋กœ ํฌํ•จ
  • ๊ธฐ์กด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฌด์‹œํ•˜๊ณ  ์ƒˆ๊ฐ’์„ ์„ค์ •ํ•ด์•ผํ•จ
[HarmonyPatch(typeof(BiomeWorker_Desert))]
[HarmonyPatch("GetScore")]
[HarmonyPatch(new Type[] { typeof(Tile) })]
internal class DesertBiome_Patch
{
    static void Postfix(ref float __result,Tile tile)
    {
        __result= 0;
        if ((tile.elevation>600)||(tile.elevation < 0))//ํ•ด๋ฐœ๊ณ ๋„ 600์ดˆ๊ณผ 0๋ฏธ๋งŒ
        {
            __result= - 100f;
        }
        if (tile.temperature <35 )//๊ฐ•์ˆ˜๋Ÿ‰์ด 600์ด์ƒ์ด๋ฉด 0์ 
        {
            __result= 0f;
        }
        __result= tile.temperature + 0.0001f; //์˜จ๋„+0.0001์ ์„ ๋ฐ˜ํ™˜
    }
}

TransPiler

TransPiler๋ฅผ ํ†ตํ•ด C#๋ฅผ ๋นŒ๋“œํ•˜๋ฉด ๋งŒ๋“ค์–ด์ง€๋Š” ์ค‘๊ฐ„์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. prefix๋ฅผ ํ†ตํ•ด ํ†ต์งธ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜ ๋˜๋Š” ํ›„์œ„์— ๋ถ™์—ฌ์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด TransPiler๋ฅผ ํ†ตํ•ด ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
OpCodes

๊ธฐ์กด BiomeWorker_Desert์˜ IL์ฝ”๋“œ

.class public auto ansi beforefieldinit RimWorld.BiomeWorker_Desert
	extends RimWorld.BiomeWorker
{
	// Methods
	.method public hidebysig specialname rtspecialname 
		instance void .ctor () cil managed 
	{
		// Method begins at RVA 0xb3744
		// Code size 7 (0x7)
		.maxstack 8

		IL_0000: ldarg.0
		IL_0001: call instance void RimWorld.BiomeWorker::.ctor()
		IL_0006: ret
	} // end of method BiomeWorker_Desert::.ctor

        //์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ GetScore ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.
	.method public hidebysig virtual 
		instance float32 GetScore (
			class RimWorld.Planet.Tile tile
		) cil managed 
	{
		// Method begins at RVA 0xb374c
		// Code size 52 (0x34)
		.maxstack 8

		IL_0000: ldarg.1  //์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ๊ณ„์‚ฐ ์Šคํƒ์— ์ ์žฌ
		IL_0001: callvirt instance bool RimWorld.Planet.Tile::get_WaterCovered()//waterCovered๊ฐ’์„ ๊ณ„์‚ฐ์Šคํƒ์œผ๋กœ ํ‘ธ์‰ฌ
		IL_0006: brfalse IL_0011//๊ฒฐ๊ณผ๊ฐ’์ด flase๋ฉด IL_0011๋กœ ์ด๋™

		IL_000b: ldc.r4 -100 //๊ณ„์‚ฐ์Šคํƒ์— -100์„ floatํ˜•ํƒœ๋กœ ํ‘ธ์‰ฌ
		IL_0010: ret//ํ˜„ ๋งค์„œ๋“œ ์ œ์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์˜ ๊ณ„์‚ฐ์Šคํƒ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ’ ํ‘ธ์‰ฌ

		IL_0011: ldarg.1//์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ๊ณ„์‚ฐ ์Šคํƒ์— ์ ์žฌ
		IL_0012: ldfld float32 RimWorld.Planet.Tile::rainfall //๊ณ„์‚ฐ ์Šคํƒ์— tile.rainfall ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
		IL_0017: ldc.r4 600 //๋‹ค์Œ ๊ณ„์‚ฐ ์Šคํƒ์— 600fํ‘ธ์‰ฌ
		IL_001c: blt.un IL_0027 //๊ณ„์‚ฐ์Šคํƒ์˜ ์ฒซ๋ฒˆ์งธ๊ฐ’๊ณผ ๋‘๋ฒˆ์งธ๊ฐ’์„ ๋น„๊ตํ›„ false์ผ๊ฒฝ์šฐ IL_0027๋กœ ์ด๋™

		IL_0021: ldc.r4 0.0 // ๊ณ„์‚ฐ ์Šคํƒ์— 0.0f๊ฐ’์„ ํ‘ธ์‰ฌ
		IL_0026: ret//ํ˜„ ๋งค์„œ๋“œ ์ œ์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์˜ ๊ณ„์‚ฐ์Šคํƒ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ’ ํ‘ธ์‰ฌ

		IL_0027: ldarg.1//์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ๊ณ„์‚ฐ ์Šคํƒ์— ์ ์žฌ
		IL_0028: ldfld float32 RimWorld.Planet.Tile::temperature//tile.temperature๊ฐ’์„ ๊ฐ€์ ธ์˜ด
		IL_002d: ldc.r4 0.0001//๊ณ„์‚ฐ ์Šคํƒ์— 0.0001fํ‘ธ์‰ฌ
		IL_0032: add//๊ณ„์‚ฐ ์Šคํƒ ์ƒ์œ„ ๋‘๊ฐ’์„ ํ•ฉ์‚ฐ ํ›„ ๊ณ„์‚ฐ์Šคํƒ์— ํ‘ธ์‰ฌ
		IL_0033: ret//ํ˜„ ๋งค์„œ๋“œ ์ œ์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์˜ ๊ณ„์‚ฐ์Šคํƒ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ’ ํ‘ธ์‰ฌ
	} // end of method BiomeWorker_Desert::GetScore

} // end of class RimWorld.BiomeWorker_Desert

์žฅํ™ฉํ•˜๊ฒŒ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ์ž‘์„ฑ๋˜์—ˆ์ง€๋งŒ ๋‹จ์ˆœํ•˜๊ฒŒ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋งค If๋ฌธ ๋ถ„๊ธฐ๋งˆ๋‹ค ์Šคํƒ๋ฉ”๋ชจ๋ฆฌ์— ๋น„๊ต๊ฒ€์‚ฌํ•  ๊ฐ’๋“ค์„ ์ ์žฌํ•˜๊ณ  ๋น„๊ต๊ฒ€์‚ฌํ›„ ๊ฑด๋„ˆ๋œ€
  • ret ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ˜„์žฌํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์ตœ์ƒ์œ„์— ์ ์žฌ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ํ•ด๋‹น GetScoreํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ๋‹ค๋ฅธํ•จ์ˆ˜ ์Šคํƒ์ตœ์ƒ์œ„์— ์ ์žฌ.

๋”ฐ๋ผ์„œ TransPiler๋Š” IL_0000๋ถ€ํ„ฐ IL_0033์˜ 16๊ฐœ์˜ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์„ ์ „๋ถ€ ์ง€์šฐ๊ณ  ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด ์ง‘ํ•ฉ์„ ๋„ฃ์œผ์…”๋„ ๋˜๊ณ  ๋ถ€๋ถ„์ ์œผ๋กœ ๋ช…๋ น์–ด ๋ถ„๊ธฐ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ์•„๋ž˜์˜ ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ IL์„ ์ด์šฉํ•ด ๋ชจ๋“  ์ง€ํ˜•์ด ์‚ฌ๋ง‰์ด ๋˜๋„๋ก ๋ฐ”๊ฟ”๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

[HarmonyPatch(typeof(BiomeWorker_Desert))]
[HarmonyPatch("GetScore")]
public static class DesertBiome_Patch
{
    static IEnumerable<CodeInstruction> Transpiler(MethodBase original, IEnumerable<CodeInstruction> instructions)
    {
        yield return new CodeInstruction(OpCodes.Ldc_R4, 10000f);//์Šคํƒ ์ตœ์ƒ๋‹จ์— 10000f ํ‘ธ์‰ฌ
        yield return new CodeInstruction(OpCodes.Ret);//์ œ์–ด๋ฐ˜ํ™˜ํ›„ 10000f๋ฅผ ํ˜ธ์ถœํ•จ์ˆ˜ ์Šคํƒ์ตœ์ƒ๋‹จ์— ํ‘ธ์‰ฌ
    }
   
}

์œ„์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

๋‹ค์Œ : ๋Œ€์ƒํ•จ์ˆ˜ ์ง€์ •