October 8th - Who doesn't like new toys?

Discussion in 'Dev Blog' started by Armagon, Oct 9, 2014.

  1. Finally my club can have disco lighting!
     
  2. Kawa

    Kawa Tiy's Beard

    Oh I'm sorry did I say object? I meant wearable item.
     
  3. MithranArkanere

    MithranArkanere Space Kumquat

    Hm... will you get the recipe if you get the weapon itself? It won't be very fun finding the weapon but not getting the recipe.
     
  4. Kawa

    Kawa Tiy's Beard

    Todays diffs, part six of six! YAAAAY
    Code:
    npcs\outpost\outposthumanexcon.npctype
    58,64c58,98
    < "statusParameters" : {
    < "baseMaxHealth" : 40,
    < "baseMaxEnergy" : 40,
    < "bodyMaterialKind" : "organic",
    < "damageConfig" : "/damage/damageresponse/npcs.config",
    < "invulnerabilityTime" : 0,
    < "energyReplenishmentRate" : 100.0
    ---
    > "statControllerSettings" : {
    > "statusProperties" : {
    > "targetMaterialKind" : "organic"
    > },
    >
    > "persistentEffectCategories" : [
    > "innate",
    > "armor",
    > "tools",
    > "lounging"
    > ],
    >
    > "primaryScriptSources" : [
    > "/stats/npc_primary.lua"
    > ],
    > "primaryScriptDelta" : 0,
    >
    > "stats" : {
    > "maxHealth" : {
    > "baseValue" : 40.0
    > },
    > "maxEnergy" : {
    > "baseValue" : 40.0
    > },
    > "powerMultiplier" : {
    > "baseValue" : 1.0
    > },
    > "protection" : {
    > "baseValue" : 0.0
    > },
    > "healthRegen" : {
    > "baseValue" : 0.0
    > },
    > "energyRegen" : {
    > "baseValue" : 100.0
    > },
    > "shieldSuppressed" : {
    > "baseValue" : 0.0
    > },
    > "invulnerable" : {
    > "baseValue" : 0.0
    66c100,115
    < }
    \ No newline at end of file
    ---
    > },
    >
    > "resources" : {
    > "health" : {
    > "maxStat" : "maxHealth",
    > "deltaStat" : "healthRegen",
    > "defaultPercentage" : 100
    > },
    > "energy" : {
    > "maxStat" : "maxEnergy",
    > "deltaStat" : "energyRegen",
    > "defaultPercentage" : 100
    > }
    > }
    > }
    > }
    
    npcs\outpost\outposthumanscientist.npctype
    58,64c58,98
    < "statusParameters" : {
    < "baseMaxHealth" : 40,
    < "baseMaxEnergy" : 40,
    < "bodyMaterialKind" : "organic",
    < "damageConfig" : "/damage/damageresponse/npcs.config",
    < "invulnerabilityTime" : 0,
    < "energyReplenishmentRate" : 100.0
    ---
    > "statControllerSettings" : {
    > "statusProperties" : {
    > "targetMaterialKind" : "organic"
    > },
    >
    > "persistentEffectCategories" : [
    > "innate",
    > "armor",
    > "tools",
    > "lounging"
    > ],
    >
    > "primaryScriptSources" : [
    > "/stats/npc_primary.lua"
    > ],
    > "primaryScriptDelta" : 0,
    >
    > "stats" : {
    > "maxHealth" : {
    > "baseValue" : 40.0
    > },
    > "maxEnergy" : {
    > "baseValue" : 40.0
    > },
    > "powerMultiplier" : {
    > "baseValue" : 1.0
    > },
    > "protection" : {
    > "baseValue" : 0.0
    > },
    > "healthRegen" : {
    > "baseValue" : 0.0
    > },
    > "energyRegen" : {
    > "baseValue" : 100.0
    > },
    > "shieldSuppressed" : {
    > "baseValue" : 0.0
    > },
    > "invulnerable" : {
    > "baseValue" : 0.0
    66c100,115
    < }
    \ No newline at end of file
    ---
    > },
    >
    > "resources" : {
    > "health" : {
    > "maxStat" : "maxHealth",
    > "deltaStat" : "healthRegen",
    > "defaultPercentage" : 100
    > },
    > "energy" : {
    > "maxStat" : "maxEnergy",
    > "deltaStat" : "energyRegen",
    > "defaultPercentage" : 100
    > }
    > }
    > }
    > }
    
    npcs\outpost\outposthumansurvivor.npctype
    59,65c59,99
    < "statusParameters" : {
    < "baseMaxHealth" : 40,
    < "baseMaxEnergy" : 40,
    < "bodyMaterialKind" : "organic",
    < "damageConfig" : "/damage/damageresponse/npcs.config",
    < "invulnerabilityTime" : 0,
    < "energyReplenishmentRate" : 100.0
    ---
    > "statControllerSettings" : {
    > "statusProperties" : {
    > "targetMaterialKind" : "organic"
    > },
    >
    > "persistentEffectCategories" : [
    > "innate",
    > "armor",
    > "tools",
    > "lounging"
    > ],
    >
    > "primaryScriptSources" : [
    > "/stats/npc_primary.lua"
    > ],
    > "primaryScriptDelta" : 0,
    >
    > "stats" : {
    > "maxHealth" : {
    > "baseValue" : 40.0
    > },
    > "maxEnergy" : {
    > "baseValue" : 40.0
    > },
    > "powerMultiplier" : {
    > "baseValue" : 1.0
    > },
    > "protection" : {
    > "baseValue" : 0.0
    > },
    > "healthRegen" : {
    > "baseValue" : 0.0
    > },
    > "energyRegen" : {
    > "baseValue" : 100.0
    > },
    > "shieldSuppressed" : {
    > "baseValue" : 0.0
    > },
    > "invulnerable" : {
    > "baseValue" : 0.0
    67c101,116
    < }
    \ No newline at end of file
    ---
    > },
    >
    > "resources" : {
    > "health" : {
    > "maxStat" : "maxHealth",
    > "deltaStat" : "healthRegen",
    > "defaultPercentage" : 100
    > },
    > "energy" : {
    > "maxStat" : "maxEnergy",
    > "deltaStat" : "energyRegen",
    > "defaultPercentage" : 100
    > }
    > }
    > }
    > }
    
    npcs\outpost\outposthylotlfloranhater.npctype
    58,64c58,98
    < "statusParameters" : {
    < "baseMaxHealth" : 40,
    < "baseMaxEnergy" : 40,
    < "bodyMaterialKind" : "organic",
    < "damageConfig" : "/damage/damageresponse/npcs.config",
    < "invulnerabilityTime" : 0,
    < "energyReplenishmentRate" : 100.0
    ---
    > "statControllerSettings" : {
    > "statusProperties" : {
    > "targetMaterialKind" : "organic"
    > },
    >
    > "persistentEffectCategories" : [
    > "innate",
    > "armor",
    > "tools",
    > "lounging"
    > ],
    >
    > "primaryScriptSources" : [
    > "/stats/npc_primary.lua"
    > ],
    > "primaryScriptDelta" : 0,
    >
    > "stats" : {
    > "maxHealth" : {
    > "baseValue" : 40.0
    > },
    > "maxEnergy" : {
    > "baseValue" : 40.0
    > },
    > "powerMultiplier" : {
    > "baseValue" : 1.0
    > },
    > "protection" : {
    > "baseValue" : 0.0
    > },
    > "healthRegen" : {
    > "baseValue" : 0.0
    > },
    > "energyRegen" : {
    > "baseValue" : 100.0
    > },
    > "shieldSuppressed" : {
    > "baseValue" : 0.0
    > },
    > "invulnerable" : {
    > "baseValue" : 0.0
    66c100,115
    < }
    \ No newline at end of file
    ---
    > },
    >
    > "resources" : {
    > "health" : {
    > "maxStat" : "maxHealth",
    > "deltaStat" : "healthRegen",
    > "defaultPercentage" : 100
    > },
    > "energy" : {
    > "maxStat" : "maxEnergy",
    > "deltaStat" : "energyRegen",
    > "defaultPercentage" : 100
    > }
    > }
    > }
    > }
    
    npcs\outpost\outposthylotlperformer.npctype
    58,64c58,98
    < "statusParameters" : {
    < "baseMaxHealth" : 40,
    < "baseMaxEnergy" : 40,
    < "bodyMaterialKind" : "organic",
    < "damageConfig" : "/damage/damageresponse/npcs.config",
    < "invulnerabilityTime" : 0,
    < "energyReplenishmentRate" : 100.0
    ---
    > "statControllerSettings" : {
    > "statusProperties" : {
    > "targetMaterialKind" : "organic"
    > },
    >
    > "persistentEffectCategories" : [
    > "innate",
    > "armor",
    > "tools",
    > "lounging"
    > ],
    >
    > "primaryScriptSources" : [
    > "/stats/npc_primary.lua"
    > ],
    > "primaryScriptDelta" : 0,
    >
    > "stats" : {
    > "maxHealth" : {
    > "baseValue" : 40.0
    > },
    > "maxEnergy" : {
    > "baseValue" : 40.0
    > },
    > "powerMultiplier" : {
    > "baseValue" : 1.0
    > },
    > "protection" : {
    > "baseValue" : 0.0
    > },
    > "healthRegen" : {
    > "baseValue" : 0.0
    > },
    > "energyRegen" : {
    > "baseValue" : 100.0
    > },
    > "shieldSuppressed" : {
    > "baseValue" : 0.0
    > },
    > "invulnerable" : {
    > "baseValue" : 0.0
    66c100,115
    < }
    \ No newline at end of file
    ---
    > },
    >
    > "resources" : {
    > "health" : {
    > "maxStat" : "maxHealth",
    > "deltaStat" : "healthRegen",
    > "defaultPercentage" : 100
    > },
    > "energy" : {
    > "maxStat" : "maxEnergy",
    > "deltaStat" : "energyRegen",
    > "defaultPercentage" : 100
    > }
    > }
    > }
    > }
    
    npcs\outpost\outposthylotlwarrior.npctype
    60,66c60,100
    < "statusParameters" : {
    < "baseMaxHealth" : 40,
    < "baseMaxEnergy" : 40,
    < "bodyMaterialKind" : "organic",
    < "damageConfig" : "/damage/damageresponse/npcs.config",
    < "invulnerabilityTime" : 0,
    < "energyReplenishmentRate" : 100.0
    ---
    > "statControllerSettings" : {
    > "statusProperties" : {
    > "targetMaterialKind" : "organic"
    > },
    >
    > "persistentEffectCategories" : [
    > "innate",
    > "armor",
    > "tools",
    > "lounging"
    > ],
    >
    > "primaryScriptSources" : [
    > "/stats/npc_primary.lua"
    > ],
    > "primaryScriptDelta" : 0,
    >
    > "stats" : {
    > "maxHealth" : {
    > "baseValue" : 40.0
    > },
    > "maxEnergy" : {
    > "baseValue" : 40.0
    > },
    > "powerMultiplier" : {
    > "baseValue" : 1.0
    > },
    > "protection" : {
    > "baseValue" : 0.0
    > },
    > "healthRegen" : {
    > "baseValue" : 0.0
    > },
    > "energyRegen" : {
    > "baseValue" : 100.0
    > },
    > "shieldSuppressed" : {
    > "baseValue" : 0.0
    > },
    > "invulnerable" : {
    > "baseValue" : 0.0
    68c102,117
    < }
    \ No newline at end of file
    ---
    > },
    >
    > "resources" : {
    > "health" : {
    > "maxStat" : "maxHealth",
    > "deltaStat" : "healthRegen",
    > "defaultPercentage" : 100
    > },
    > "energy" : {
    > "maxStat" : "maxEnergy",
    > "deltaStat" : "energyRegen",
    > "defaultPercentage" : 100
    > }
    > }
    > }
    > }
    
    objects\apex\apexbed\apexbed.object
    23,24c23
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\apex\apexoven\apexoven.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 5,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\apex\apextorturebed\apextorturebed.object
    22,23c22
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.05 }
    ---
    > "regeneration1"
    
    objects\apex\classicbed\classicbed.object
    24,25c24
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\apex\classiccandlestick\classiccandlestick.object
    28,33c28
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 4,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\apex\respawnpod\behavior.lua
    15c15
    < function main()
    ---
    > function update(dt)
    20c20
    < self.state.update(entity.dt())
    ---
    > self.state.update(dt)
    60c60
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\apex\securitycamera\securitycamera.lua
    1,5c1,6
    < function init(args)
    < self.state = stateMachine.create({
    < "alertState",
    < "scanState"
    < })
    ---
    > function init(virtual)
    > if not virtual then
    > self.state = stateMachine.create({
    > "alertState",
    > "scanState"
    > })
    7,9c8,11
    < entity.setAnimationState("movement", "idle")
    < entity.setInteractive(false)
    < entity.setAllOutboundNodes(false)
    ---
    > entity.setAnimationState("movement", "idle")
    > entity.setInteractive(false)
    > entity.setAllOutboundNodes(false)
    > end
    12,13c14,15
    < function main(args)
    < self.state.update(entity.dt())
    ---
    > function update(dt)
    > self.state.update(dt)
    
    objects\apex\turret\turret.lua
    1,5c1,6
    < function init(args)
    < self.state = stateMachine.create({
    < "attackState",
    < "scanState"
    < })
    ---
    > function init(virtual)
    > if not virtual then
    > self.state = stateMachine.create({
    > "attackState",
    > "scanState"
    > })
    7,9c8,11
    < entity.setAnimationState("movement", "idle")
    < entity.setInteractive(false)
    < entity.setAllOutboundNodes(false)
    ---
    > entity.setAnimationState("movement", "idle")
    > entity.setInteractive(false)
    > entity.setAllOutboundNodes(false)
    > end
    13,14c15,16
    < function main(args)
    < self.state.update(entity.dt())
    ---
    > function update(dt)
    > self.state.update(dt)
    
    objects\avian\birdbed\birdbed.object
    23,24c23
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\avian\birdgroundlantern\birdgroundlantern.object
    27,32c27
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 15,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\avian\crystaltorch\crystaltorch.object
    18,23c18
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 15,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\avian\propeller\propeller.object
    30,38c30
    < "soundEffect" : "/sfx/objects/propeller.wav",
    <
    < "statusEffects" : [
    < {
    < "kind" : "slash",
    < "amount" : 20,
    < "range" : 0
    < }
    < ]
    ---
    > "soundEffect" : "/sfx/objects/propeller.wav"
    39a32
    > //TODO: touch damage
    
    objects\avian\sacrificialaltar\sacrificialaltar.object
    23,24c23
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.05 }
    ---
    > "regeneration1"
    
    objects\avian\sawblade\sawblade.object
    86c86
    < //mollys first object
    ---
    > //mollys first object (note: it was actually oven1, this is molly's first copy paste derp)
    88c88
    < "soundEffect" : "/sfx/objects/sawblade.wav",
    ---
    > "soundEffect" : "/sfx/objects/sawblade.wav"
    90,96c90
    < "statusEffects" : [
    < {
    < "kind" : "directdamage",
    < "amount" : 13.3,
    < "range" : 0
    < }
    < ]
    ---
    > //TODO: touch damage
    
    objects\avian\tribalbed2\tribalbed2.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\avian\triballamp\triballamp.object
    17,22c17
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 15,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\crafting\alloyfurnace\alloyfurnace.object
    63,69c63
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\crafting\refinery\refinery.object
    79,85c79
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\crafting\scififurnace\scififurnace.object
    63,69c63
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\crafting\stonefurnace\stonefurnace.object
    25,31c25
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\floranbed\floranbed.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\floran\floranchandelier\floranchandelier.object
    27,32c27
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 24,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\floranstove\floranstove.object
    78,84c78
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\huntinggroundtorch\huntinggroundtorch.object
    28,34c28
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\huntingpunjisticks1\huntingpunjisticks1.object
    10d9
    <
    18,19d16
    <
    <
    39d35
    <
    53,62d48
    <
    < }
    < ],
    <
    < "statusEffects" : [
    < {
    < "kind" : "directDamage",
    < "damageKind" : "spear",
    < "amount" : 7,
    < "range" : 0
    64a51,52
    >
    > //TODO: touch damage
    
    objects\floran\huntingpunjisticks2\huntingpunjisticks2.object
    10d9
    <
    18,19d16
    <
    <
    39d35
    <
    53,62d48
    <
    < }
    < ],
    <
    < "statusEffects" : [
    < {
    < "kind" : "directDamage",
    < "damageKind" : "spear",
    < "amount" : 7,
    < "range" : 0
    65,66d50
    < }
    <
    67a52,53
    > //TODO: touch damage
    > }
    \ No newline at end of file
    
    objects\floran\plantbed1\plantbed1.object
    24,25c24
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\floran\plantbed2\plantbed2.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\floran\plantbed3\plantbed3.object
    24,25c24
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\floran\plantbed4\plantbed4.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\floran\planttorch\planttorch.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\plantvolcano1\plantvolcano1.object
    17,22c17
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\plantvolcano2\plantvolcano2.object
    17,22c17
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\plantvolcano3\plantvolcano3.object
    17,22c17
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\plantvolcano4\plantvolcano4.object
    17,22c17
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\floran\plantvolcano5\plantvolcano5.object
    17,22c17
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\gate\ancientconsole\ancientconsole.lua
    12c12
    < function main()
    ---
    > function update(dt)
    27c27
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\gate\ancientpillar\ancientpillar.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\generic\altar1\altar1.object
    23,24c23
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.05 }
    ---
    > "regeneration1"
    
    objects\generic\burningcoals\burningcoals.object
    51,53c51
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 4
    ---
    > "effect" : "burning"
    
    objects\generic\campfire\campfire.object
    36c36
    < "position" : [0.5, 0.3],
    ---
    > "position" : [0.5, 0.3],
    50c50
    < "position" : [0.4, 0]
    ---
    > "position" : [0.4, 0]
    83,89c83
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\generic\carbed\carbed.object
    18,19c18
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\generic\ironbed\ironbed.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\generic\ironlight\ironlight.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\generic\kennel\kennel.object
    24,25c24
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\generic\nanostove\nanostove.object
    59,65c59
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 140,
    < "range" : 20
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\generic\oillantern1\oillantern1.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 6,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\generic\oillanterntall\oillanterntall.object
    17,22c17
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 6,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\generic\rusticoven\rusticoven.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\generic\sleepingbag\sleepingbag.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\generic\tent1\tent1.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\generic\tent2\tent2.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\generic\torch\torch.object
    21,28d20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < }
    < ],
    <
    
    objects\generic\woodenbed\woodenbed.object
    41,42c41
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.03 }
    ---
    > "regeneration1"
    
    objects\generic\woodenbed2\woodenbed2.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\generic\woodentalllantern\woodentalllantern.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\generic\wreckbed\wreckbed.object
    24,25c24
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\glitch\guillotine\guillotine.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\glitch\haypile\haypile.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\glitch\medievalbed\medievalbed.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\glitch\medievalcandle\medievalcandle.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 4,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\medievalcellbed\medievalcellbed.object
    24,25c24
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\glitch\medievalchandelier\medievalchandelier.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\medievalfireplace\medievalfireplace.object
    21,26c21
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\medievalfurnace\medievalfurnace.object
    25,30c25
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 50,
    < "range" : 8
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\medievallamp\medievallamp.object
    18,23c18
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 6,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\medievallargecookingpot\medievallargecookingpot.object
    68,74c68
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 8
    < }
    < ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\medievalspikes\medievalspikes.object
    28d27
    <
    30,39c29
    < ],
    <
    < "statusEffects" : [
    < {
    < "kind" : "directDamage",
    < "damageKind" : "spear",
    < "amount" : 7,
    < "range" : 0
    < }
    < ]
    ---
    > ]
    40a31
    > //TODO: touch damage
    
    objects\glitch\medievalstreetlamp\medievalstreetlamp.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 6,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\medievaltorch\medievaltorch.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\royalbed\royalbed.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\glitch\royalcandles\royalcandles.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\glitch\wheelbarrow\wheelbarrow.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\holiday\giftmonsterbox\giftmonsterbox.lua
    5c5
    < function main()
    ---
    > function update(dt)
    10c10
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\holiday\heartforge\heartforge.object
    23,28c23
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 50,
    < "range" : 8
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\holiday\menorah\menorah.object
    21,26c21
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\human\barbedwire\barbedwire.object
    28,39d27
    <
    < }
    < ],
    <
    < "statusEffects" : [
    < {
    < "kind" : "directdamage",
    < "amount" : 0.5,
    < "range" : 0
    < },
    < {
    < "kind" : "encumbered"
    41a30,31
    >
    > //TODO: touch damage
    
    objects\human\bunkerheater1\bunkerheater1.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 100,
    < "range" : 20
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\human\bunkerrobotfactory\behavior.lua
    15c15
    < function main()
    ---
    > function update(dt)
    17c17
    < self.state.update(entity.dt())
    ---
    > self.state.update(dt)
    90c90
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\human\oven1\oven1.object
    20,25c20
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 5,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\human\prisonbarrelfire\prisonbarrelfire.object
    18,23c18
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 70,
    < "range" : 5
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\human\prisonbed\prisonbed.object
    17c17
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    39d38
    <
    
    objects\human\prisonradiator\prisonradiator.object
    17,22c17
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 80,
    < "range" : 15
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\human\prisontorturebed2\prisontorturebed2.object
    24,25c24
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\hylotl\hylotlbed2\hylotlbed2.object
    18,19c18
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\bone\bonebed\bonebed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\crystal\crystalbed\crystalbed.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\crystal\crystallamp\crystallamp.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\minibiome\eyepatch\eyebed\eyebed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\geometric\geometricbed\geometricbed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\giantflower\giantflowerbed\giantflowerbed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\giantflower\giantflowerlamp\giantflowerlamp.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\minibiome\giantflower\strangeflowerbasket\strangeflowerbasket.object
    22c22
    < "sitPosition" : [-6, 22],
    ---
    > "sitPosition" : [-6, 22],
    28d27
    <
    34,38c33
    < "sitFlipDirection" : false,
    < "sitStatusEffects" : [
    < { "kind" : "Nude" }
    < ]
    <
    ---
    > "sitFlipDirection" : false
    
    objects\minibiome\ice\icebed\icebed.object
    25,26c25
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\mushroom\shroombed\shroombed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\mushroom\shroomlamp\shroomlamp.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\minibiome\oasis\reedbed1\reedbed1.object
    24,25c24
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\rainbow\rainbowbed\rainbowbed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\rust\rustbed\rustbed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\sandstone\sandstonebed\sandstonebed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\sandstone\sandstonetorch\sandstonetorch.object
    21,26c21
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 8,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\minibiome\snow\snowman\snowman.frames
    4c4
    < "size" : [24, 32],
    ---
    > "size" : [24, 26],
    
    objects\minibiome\snow\snowman\snowman.object
    7d6
    < "objectItem" : "snowball",
    14c13
    < "avianDescription" : "A snowman. I'm jealous of his hat.",
    ---
    > "avianDescription" : "A snowman. He feels like he's missing something.",
    20c19
    < "inventoryIcon" : "capsulemedicon.png",
    ---
    > "inventoryIcon" : "snowmanicon.png",
    24,28c23,27
    < "imagePosition" : [0, 0],
    < "frames" : 1,
    < "animationCycle" : 0.5,
    <
    < "spaceScan" : 0.1,
    ---
    > "direction" : "left",
    > "flipImages" : true,
    > "imagePosition" : [-8, 0],
    >
    > "spaces" : [ [-1, 0], [0, 0], [1, 0], [-1, 1], [0, 1], [1, 1], [-1, 2], [0, 2], [1, 2], [-1, 3], [0, 3], [1, 3] ],
    29a29,33
    > },
    > {
    > "image" : "snowman.png:<color>",
    > "direction" : "right",
    > "imagePosition" : [-8, 0],
    30a35,36
    > "spaces" : [ [-1, 0], [0, 0], [1, 0], [-1, 1], [0, 1], [1, 1], [-1, 2], [0, 2], [1, 2], [-1, 3], [0, 3], [1, 3] ],
    > "anchors" : [ "bottom" ]
    35c41
    < [ [ "snowball", 1, { } ], [ "snowball", 1, { } ], [ "carrot", 1, { } ], [ "fullwood1", 1, { } ], [ "fullwood1", 1, { } ], [ "fancyhead", 1, { } ] ]
    ---
    > [ [ "giganticsnowball", 1, { } ], [ "largesnowball", 1, { } ], [ "mediumsnowball", 1, { } ], [ "carrot", 1, { } ], [ "fullwood1", 1, { } ], [ "coalore", 2, { } ] ]
    38c44
    < [ [ "snowball", 1, { } ], [ "snowball", 1, { } ], [ "snowball", 1, { } ], [ "snowball", 1, { } ], [ "snowball", 1, { } ], [ "snowball", 1, { } ] ]
    ---
    > [ [ "giganticsnowball", 1, { } ], [ "largesnowball", 1, { } ], [ "mediumsnowball", 1, { } ], [ "carrot", 1, { } ], [ "fullwood1", 1, { } ], [ "coalore", 2, { } ] ]
    
    objects\minibiome\tar\tarbed\tarbed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\minibiome\tar\tarlight\tarlight.object
    21,26c21
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\minibiome\toxicplains\toxiclamp1\toxiclamp1.object
    21,26c21
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\minibiome\toxicplains\toxiclamp2\toxiclamp2.object
    21,26c21
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\mission\lunarbasebunk\lunarbasebunk.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\mission\lunarbaselantern\lunarbaselantern.object
    18,23c18
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\mission\skulltorch\skulltorch.object
    27,32c27
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 15,
    < "range" : 4
    < } ],
    ---
    > "statusEffects" : [ ],
    39,42c34,37
    <
    < "direction" : "left",
    < "flipImages" : true,
    <
    ---
    >
    > "direction" : "left",
    > "flipImages" : true,
    >
    45c40
    < "animationPosition" : [-8, 0]
    ---
    > "animationPosition" : [-8, 0]
    47c42
    < {
    ---
    > {
    50,51c45,46
    <
    < "direction" : "right",
    ---
    >
    > "direction" : "right",
    55c50
    < "animationPosition" : [-8, 0]
    ---
    > "animationPosition" : [-8, 0]
    73d67
    <
    
    objects\outpost\bathroomstall\bathroomstall.object
    21,23c21,23
    < "flipImages" : true,
    < "sitPosition" : [-6, 22],
    < "direction" : "left",
    ---
    > "flipImages" : true,
    > "sitPosition" : [-6, 22],
    > "direction" : "left",
    33c33
    < {
    ---
    > {
    35,36c35,36
    < "sitPosition" : [2, 22],
    < "direction" : "right",
    ---
    > "sitPosition" : [2, 22],
    > "direction" : "right",
    44d43
    <
    50,53c49
    < "sitFlipDirection" : false,
    < "sitStatusEffects" : [
    < { "kind" : "Nude" }
    < ]
    ---
    > "sitFlipDirection" : false
    
    objects\outpost\outpostbed\outpostbed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\spawner\monsterspawner.lua
    22c22
    < function main()
    ---
    > function update(dt)
    24c24
    < if storage.cooldown > 0 then storage.cooldown = storage.cooldown - entity.dt() end
    ---
    > if storage.cooldown > 0 then storage.cooldown = storage.cooldown - dt end
    58c58
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\spawner\spawners\spawner.lua
    6c6
    < function main()
    ---
    > function update(dt)
    
    objects\tiered\tier10bed\tier10bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration4"
    42d40
    <
    
    objects\tiered\tier10light\tier10light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier1bed\tier1bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\tiered\tier1light\tier1light.object
    21,26c21
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier2bed\tier2bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration1"
    
    objects\tiered\tier2light\tier2light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier3bed\tier3bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration2"
    
    objects\tiered\tier3light\tier3light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier4bed\tier4bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration2"
    
    objects\tiered\tier4light\tier4light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier5bed\tier5bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration3"
    
    objects\tiered\tier5light\tier5light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier6bed\tier6bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration4"
    
    objects\tiered\tier6light\tier6light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier7bed\tier7bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration3"
    
    objects\tiered\tier7light\tier7light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier8bed\tier8bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration4"
    
    objects\tiered\tier8light\tier8light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\tiered\tier9bed\tier9bed.object
    26,27c26
    < { "kind" : "Nude" },
    < { "kind" : "Health", "amount" : 0.06 }
    ---
    > "regeneration3"
    
    objects\tiered\tier9light\tier9light.object
    19,24c19
    < "statusEffects" : [
    < {
    < "kind" : "Warmth",
    < "amount" : 10,
    < "range" : 2
    < } ],
    ---
    > "statusEffects" : [ ],
    
    objects\wired\alarm\alarm.lua
    10c10
    < function main()
    ---
    > function update(dt)
    21c21
    < self.alarmSoundTimer = self.alarmSoundTimer - entity.dt()
    ---
    > self.alarmSoundTimer = self.alarmSoundTimer - dt
    28c28
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\wired\door\door.lua
    59c59
    < return (entity.animationState("doorState") == "closeLeft" or entity.animationState("doorState") == "openLeft") and -entity.direction() or entity.direction()
    ---
    > return (entity.animationState("doorState") == "closeLeft" or entity.animationState("doorState") == "openLeft") and -entity.direction() or mcontroller.direction()
    
    objects\wired\drain\drain.lua
    31c31
    < function main()
    ---
    > function update(dt)
    38c38
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\wired\landmine\landmine.lua
    21c21
    < function main()
    ---
    > function update(dt)
    39c39
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\wired\lightsensor\lightsensor.lua
    13c13
    < function main()
    ---
    > function update(dt)
    30c30
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\wired\liquidsensor\liquidsensor.lua
    5c5
    < function main()
    ---
    > function update(dt)
    24c24
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\wired\logic\dlatch.lua
    23c23
    < function main()
    ---
    > function update(dt)
    
    objects\wired\logic\logic.lua
    37c37
    < function main()
    ---
    > function update(dt)
    
    objects\wired\logic\timer.lua
    27c27
    < function main()
    ---
    > function update(dt)
    
    objects\wired\momentaryswitch\momentaryswitch.lua
    38c38
    < function main()
    ---
    > function update(dt)
    
    objects\wired\proximitysensor\proximitysensor.lua
    38c38
    < function main()
    ---
    > function update(dt)
    40c40
    < self.triggerTimer = self.triggerTimer - entity.dt()
    ---
    > self.triggerTimer = self.triggerTimer - dt
    54c54
    < end
    \ No newline at end of file
    ---
    > end
    
    objects\wired\standingturret\standingturret.lua
    47c47
    < function main(args)
    ---
    > function update(dt)
    49c49
    < self.state.update(entity.dt())
    ---
    > self.state.update(dt)
    248c248
    < local energy = storage.energy + self.energy.energyRegen * energyMultiplier * entity.dt()
    ---
    > local energy = storage.energy + self.energy.energyRegen * energyMultiplier * script.updateDt()
    383c383
    < stateData.timer = stateData.timer + entity.dt()
    ---
    > stateData.timer = stateData.timer + script.updateDt()
    399c399
    < stateData.targetCooldown = stateData.targetCooldown - entity.dt()
    ---
    > stateData.targetCooldown = stateData.targetCooldown - script.updateDt()
    489c489
    < stateData.letGoTimer = stateData.letGoTimer + entity.dt()
    ---
    > stateData.letGoTimer = stateData.letGoTimer + script.updateDt()
    506c506
    < return vec2.div(deltaPos, entity.dt())
    ---
    > return vec2.div(deltaPos, script.updateDt())
    
    objects\wired\switch\switchwithinput.lua
    35c35
    < function main(args)
    ---
    > function update(dt)
    42c42
    < end
    \ No newline at end of file
    ---
    > end
    
    particles\burningdust.particle
    8c8
    < "finalVelocity" : [0, 4],
    ---
    > "finalVelocity" : [0, 3],
    14c14
    < "layer" : "back",
    ---
    > "layer" : "middle",
    17c17
    < "initialVelocity" : [3.0, 3.0]
    ---
    > "initialVelocity" : [2.0, 2.0]
    
    particles\frozenburningdust.particle
    8c8
    < "finalVelocity" : [0, 4],
    ---
    > "finalVelocity" : [0, 3],
    14c14
    < "layer" : "back",
    ---
    > "layer" : "middle",
    17c17
    < "initialVelocity" : [3.0, 3.0]
    ---
    > "initialVelocity" : [2.0, 2.0]
    
    projectiles\burningstatusprojectile\burningstatusprojectile.projectile
    24,30c24
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\explosions\robotwake\robotwake.projectile
    132c132
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\explosions\snowballexplosion\snowballexplosion.config
    5c5,7
    < "action" : "spark"
    ---
    > "action" : "projectile",
    > "inheritDamageFactor" : 0,
    > "type" : "snowballexplosion"
    
    projectiles\explosions\swordshot\swordshot.projectile
    2a3
    > "physics" : "bullet",
    11c12
    < "piercing" : true,
    ---
    > "piercing" : false,
    
    projectiles\fire\firefinish\firefinish.projectile
    22,28c22
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\fire\firepart1\firepart1.projectile
    36,42c36
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\fire\firepart2\firepart2.projectile
    36,42c36
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\fire\firepart3\firepart3.projectile
    36,42c36
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\fire\firepart4\firepart4.projectile
    36,42c36
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\fire\firepart5\firepart5.projectile
    36,42c36
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\guns\bullets\delayed\delayed.projectile
    18c18
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\bullets\explosivebullet\explosivebullet.projectile
    15c15
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\bullets\splitbullet\splitbullet.projectile
    24c24
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\bullets\stickybullet\stickybullet.projectile
    18c18
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\bullets\stingergunsting\stingergunsting.projectile
    17c17
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\guns\bullets\trishot\trishot.projectile
    30c30
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\acidgrenade\acidgrenade.projectile
    57c57
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\acidgrenadecluster\acidgrenadecluster.projectile
    25c25
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\bomb\bomb.projectile
    19c19
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\bouncycluster\bouncycluster.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\bouncyclustergrenade\bouncyclustergrenade.projectile
    53c53
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\cluster\cluster.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\clustergrenade\clustergrenade.projectile
    53c53
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\gravitybomb\gravitybomb.projectile
    20c20
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\grenade\grenade.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\impactgrenade\impactgrenade.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\marioball\marioball.projectile
    18c18
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\mouse\mouse.projectile
    21c21
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\nailbomb\nailbomb.projectile
    65c65
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\pig\pig.projectile
    21c21
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\pill\pill.projectile
    57c57
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\shockbomb\shockbomb.projectile
    23c23
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\spikeball\spikeball.projectile
    18c18
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\grenades\splitter\splitter.projectile
    40c40
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\orbitaltest\orbitaldown\orbitaldown.projectile
    18c18
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\orbitaltest\orbitallaunch\orbitallaunch.projectile
    23c23
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\orbitaltest\orbitalup\orbitalup.projectile
    23c23
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\plasmabullets\plasmabouncer\plasmabouncer.projectile
    20c20
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\plasmabullets\stickyplasma\stickyplasma.projectile
    25c25
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\unsorted\chargedbustershot\chargedbustershot.projectile
    20c20
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\unsorted\chargedflamearrow\chargedflamearrow.projectile
    15,21c15
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\guns\unsorted\chargedfrozenflamearrow\chargedfrozenflamearrow.projectile
    15,24c15
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "white",
    < "duration" : 5.0
    < },
    < { "kind" : "frozenburning" },
    < {
    < "kind" : "frozenslow"
    < }
    ---
    > "frozenburning"
    
    projectiles\guns\unsorted\chargedicearrow\chargedicearrow.projectile
    15,17c15
    < {
    < "kind" : "slow"
    < }
    ---
    > "frostslow"
    
    projectiles\guns\unsorted\flamebolt\flamebolt.projectile
    15,21c15
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\guns\unsorted\flamethrower\flamethrower.projectile
    17,23c17
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\guns\unsorted\icebolt\icebolt.projectile
    15,18c15
    < {
    < "kind" : "slow",
    < "duration" : 3
    < }
    ---
    > "frostslow"
    
    projectiles\guns\unsorted\lightglobes\whiteglobe\whiteglobe.projectile
    23c23
    < { "kind" : "glowinitiator" }
    ---
    > "glow"
    
    projectiles\guns\unsorted\poisonbolt\poisonbolt.projectile
    12c12
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\guns\unsorted\pollenpumpgas\pollenpumpgas.projectile
    14c14
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\guns\unsorted\pollenpumpgas\pollenpumpgasspray.projectile
    14c14
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\guns\unsorted\rocket\rocket.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\guns\unsorted\tarblob\tarblob.projectile
    20,27c20
    < {
    < "kind" : "tarslow",
    < "duration" : 3,
    < "primitives" : [
    < { "name" : "jumpboost", "percentage" : -20, "mode" : "min" },
    < { "name" : "runboost", "percentage" : -25, "mode" : "min" }
    < ]
    < }
    ---
    > "tarslow"
    
    projectiles\guns\unsorted\waterballoon\snowandwaterballoon.projectile
    13c13
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\healingstatusprojectile\healingstatusprojectile.projectile
    19,22c19
    < {
    < "kind" : "health",
    < "amount" : 100
    < }
    ---
    > "regeneration"
    
    projectiles\minibiomelegendaries\cellblast\cellblast.projectile
    19c19
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\cellblastx\cellblastx.projectile
    19c19
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\coralshardx\coralshardx.projectile
    14,20c14
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\minibiomelegendaries\hivebug\hivebug.projectile
    67c67
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\hivebugx\hivebugx.projectile
    67c67
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\hivecluster\hivecluster.projectile
    26c26
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\hiveclusterx\hiveclusterx.projectile
    26c26
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\slimeblob\slimeblob.projectile
    31c31
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\slimeblobx\slimeblobx.projectile
    13c13
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    46c46
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\slimecluster\slimecluster.projectile
    26c26
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\slimeclusterx\slimeclusterx.projectile
    26c26
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\minibiomelegendaries\xtermite\xtermite.projectile
    22c22
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\beetle\beetle.projectile
    29c29
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\blueflame\bluefire.projectile
    18,24c18
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "blue",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\npcs\blueflame\blueflame.projectile
    17,23c17
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "blue",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\npcs\clustergoo\clustergoo.projectile
    51c51
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\darkgravityball\darkgravityball.projectile
    13c13
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\darkplasma\darkplasma.projectile
    19c19
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\explosivegoo\explosivegoo.projectile
    24c24
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\fireball\fireball.projectile
    19c19
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\flame\flame.projectile
    17,23c17
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\npcs\gas2\gas2.projectile
    14c14
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\npcs\glitter\glitter.projectile
    18a19
    > "glow",
    20,21c21,22
    < "kind" : "nudeshine",
    < "duration" : 5.0
    ---
    > "effect" : "paralysis",
    > "duration" : 1.0
    
    projectiles\npcs\goocluster\goocluster.projectile
    25c25
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\grabbed\grabbed.projectile
    15c15,16
    < "kind" : "grabbed"
    ---
    > "effect" : "paralysis",
    > "duration" : 2.0
    
    projectiles\npcs\icebreath\icebreath.projectile
    31c31
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\jellybossexplode\jellybossexplode.projectile
    121c121
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\npcs\jellybossgoo\jellybossgoo.projectile
    24c24
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\lightball\lightball.projectile
    18,23c18
    < {
    < "kind" : "glow",
    < "color" : "yellow",
    < "amount" : 50,
    < "duration" : 10.0
    < }
    ---
    > "glow"
    
    projectiles\npcs\lightball\lightballout.projectile
    18,23c18
    < {
    < "kind" : "glow",
    < "color" : "yellow",
    < "amount" : 50,
    < "duration" : 10.0
    < }
    ---
    > "glow"
    
    projectiles\npcs\mudball\mudball.projectile
    13,16c13
    < {
    < "kind" : "heavyslow",
    < "duration" : 7.0
    < }
    ---
    > "mudslow"
    
    projectiles\npcs\penguintankround\penguintankround.projectile
    16c16
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\poopbreath\poopbreath.projectile
    17c17
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\npcs\pulsecannon\pulsecannon.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\npcs\spicecloud\spicecloud.projectile
    16,29c16,17
    < {
    < "kind" : "runboost",
    < "amount" : 0.2,
    < "duration" : 9.0
    < },
    < {
    < "kind" : "jumpboost",
    < "amount" : 0.1,
    < "duration" : 9.0
    < },
    < {
    < "kind" : "testpoison",
    < "duration" : 9.0
    < }
    ---
    > "runboost",
    > "weakpoison"
    
    projectiles\staves\racialstaves\aqua\splashspawner1.projectile
    48c48
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\staves\racialstaves\crystal\cardinalschalcedony\chalcedonyspawner.projectile
    81c81
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\staves\racialstaves\light\redgiant\redgiantspawner.projectile
    116c116
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\swoosh\axe\coralswoosh\coralswoosh.projectile
    16,22c16
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\swoosh\axe\coralswooshx\coralswooshx.projectile
    16,22c16
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\swoosh\axe\fireaxe\fireaxe.projectile
    16,22c16
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\swoosh\axe\poisonaxe\poisonaxe.projectile
    16c16
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\swoosh\bloodbreath\bloodbreath.projectile
    31c31
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\swoosh\broadsword\firebroadsword\firebroadsword.projectile
    16,22c16
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\swoosh\broadsword\poisonbroadsword\poisonbroadsword.projectile
    16c16
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\swoosh\dagger\firedagger\firedagger.projectile
    16,22c16
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\swoosh\dagger\poisondagger\poisondagger.projectile
    16c16
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\swoosh\hammer\firehammer\firehammer.projectile
    16,22c16
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\swoosh\hammer\floranmaceswoosh\floranmaceswoosh.projectile
    15c15
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\swoosh\hammer\poisonhammer\poisonhammer.projectile
    16c16
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\swoosh\hammer\tarhammerswoosh\tarhammerswoosh.projectile
    16,23c16
    < {
    < "kind" : "tarslow",
    < "duration" : 5,
    < "primitives" : [
    < { "name" : "jumpboost", "percentage" : -20, "mode" : "min" },
    < { "name" : "runboost", "percentage" : -25, "mode" : "min" }
    < ]
    < }
    ---
    > "tarslow"
    
    projectiles\swoosh\shortsword\fireshortsword\fireshortsword.projectile
    16,22c16
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\swoosh\shortsword\poisonshortsword\poisonshortsword.projectile
    16c16
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\swoosh\shortsword\slimeswoosh\slimeswoosh.projectile
    16c16
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    18d17
    <
    28c27
    < "firePosition" : [-10, 5],
    ---
    > "firePosition" : [-10, 5],
    
    projectiles\swoosh\shortsword\slimeswooshx\slimeswooshx.projectile
    16c16
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    18d17
    <
    28c27
    < "firePosition" : [-10, 5],
    ---
    > "firePosition" : [-10, 5],
    
    projectiles\swoosh\spear\firespear\firespear.projectile
    16,22c16
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    24,25c18
    < }
    <
    ---
    > }
    \ No newline at end of file
    
    projectiles\swoosh\spear\poisonspear\poisonspear.projectile
    16c16
    < { "kind" : "testpoison" }
    ---
    > "weakpoison"
    
    projectiles\swoosh\spear\tarspearswoosh\tarspearswoosh.projectile
    15,22c15
    < {
    < "kind" : "tarslow",
    < "duration" : 3,
    < "primitives" : [
    < { "name" : "jumpboost", "percentage" : -20, "mode" : "min" },
    < { "name" : "runboost", "percentage" : -25, "mode" : "min" }
    < ]
    < }
    ---
    > "tarslow"
    
    projectiles\throwable\bomb\zbomb.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\throwable\bone\bone.projectile
    18c18
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\throwable\electrogrenade\electrogrenade.projectile
    132c132
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\throwable\flare\flare.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\throwable\gasgrenade\gasgrenade.projectile
    132c132
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\throwable\glowgas\glowgas.projectile
    14,17c14
    < {
    < "kind" : "glowinitiator",
    < "amount" : 0.5
    < }
    ---
    > "glow"
    
    projectiles\throwable\handgrenade\handgrenade.projectile
    16c16
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\throwable\healinggas\healinggas.projectile
    14,17c14
    < {
    < "kind" : "healthinitiator",
    < "amount" : 0.5
    < }
    ---
    > "regeneration"
    
    projectiles\throwable\jumpgas\jumpgas.projectile
    14,18c14
    < {
    < "kind" : "jumpboostinitiator",
    < "amount" : 0.5
    <
    < }
    ---
    > "jumpboost"
    
    projectiles\throwable\molotovflame\molotovflame.projectile
    22,28c22
    < {
    < "kind" : "glow",
    < "amount" : 100.0,
    < "color" : "orange",
    < "duration" : 5.0
    < },
    < { "kind" : "testburning" }
    ---
    > "burning"
    
    projectiles\throwable\plasmagrenade\plasmagrenade.projectile
    17c17
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\throwable\rungas\rungas.projectile
    14,18c14
    < {
    < "kind" : "runboostinitiator",
    < "amount" : 0.5
    <
    < }
    ---
    > "runboost"
    
    projectiles\throwable\snowballgigantic\giganticsnowball.projectile
    8a9
    > "damagePoly" : [ [-9, 0], [-6, -6], [0, -9], [6, -6], [9, 0], [6, 6], [0, 9], [-6, 6] ],
    12c13
    < "file" : "/projectiles/explosions/snowballexplosion/snowballexplosion.config"
    ---
    > "file" : "/projectiles/explosions/giganticsnowballexplosion/giganticsnowballexplosion.config"
    
    projectiles\throwable\snowballlarge\largesnowball.projectile
    8a9
    > "damagePoly" : [ [-7, 0], [-4.6, -4.6], [0, -7], [4.6, -4.6], [7, 0], [4.6, 4.6], [0, 7], [-4.6, 4.6] ],
    12c13
    < "file" : "/projectiles/explosions/snowballexplosion/snowballexplosion.config"
    ---
    > "file" : "/projectiles/explosions/largesnowballexplosion/largesnowballexplosion.config"
    
    projectiles\throwable\snowballmedium\mediumsnowball.projectile
    8a9
    > "damagePoly" : [ [-4.5, 0], [-3, -3], [0, -4.5], [3, -3], [4.5, 0], [3, 3], [0, 4.5], [-3, 3] ],
    12c13
    < "file" : "/projectiles/explosions/snowballexplosion/snowballexplosion.config"
    ---
    > "file" : "/projectiles/explosions/mediumsnowballexplosion/mediumsnowballexplosion.config"
    
    projectiles\throwable\tarball\tarball.projectile
    20,27c20
    < {
    < "kind" : "tarslow",
    < "duration" : 3,
    < "primitives" : [
    < { "name" : "jumpboost", "percentage" : -20, "mode" : "min" },
    < { "name" : "runboost", "percentage" : -25, "mode" : "min" }
    < ]
    < }
    ---
    > "tarslow"
    
    projectiles\weather\junksatellite\junksatellite.projectile
    16c16
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\weather\junksatellite2\junksatellite2.projectile
    16c16
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\weather\largemeteor\largemeteor.projectile
    22c22
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    projectiles\weather\smallmeteor\smallmeteor.projectile
    16c16
    < "damageType" : "hitTest",
    ---
    > "damageType" : "NoDamage",
    
    recipes\biomes\snow\snowball.recipe
    6c6
    < "groups" : [ "craftingtable", "materials", "all" ]
    ---
    > "groups" : [ "craftingtable", "weapons", "all" ]
    
    recipes\biomes\tar\tarball.recipe
    6c6
    < "groups" : [ "craftingtable", "materials", "all" ]
    ---
    > "groups" : [ "craftingtable", "weapons", "all" ]
    
    scripts\entityproxy.lua
    5c5
    < -- local npcIds = world.entityQuery(entity.position(), 100, {includedTypes = {"npc"}})
    ---
    > -- local npcIds = world.entityQuery(mcontroller.position(), 100, {includedTypes = {"npc"}})
    
    scripts\sensors.lua
    32c32
    < return world.lineCollision(entity.position(), position, true)
    ---
    > return world.lineCollision(mcontroller.position(), position, true)
    
    scripts\statemachine.lua
    111c111
    < -- the main() function)
    ---
    > -- the update(dt) function)
    
    scripts\util.lua
    7c7
    < reverse = util.toDirection(direction) ~= entity.facingDirection()
    ---
    > reverse = util.toDirection(direction) ~= mcontroller.facingDirection()
    135a136
    > local dt = script.updateDt()
    137d137
    < local dt = entity.dt()
    139d138
    <
    150c149
    < local g = gravityMultiplier * world.gravity(entity.position())
    ---
    > local g = gravityMultiplier * world.gravity(mcontroller.position())
    
    scripts\api\monsterhooks.lua
    9c9
    < function main() end
    ---
    > function update(dt) end
    
    scripts\api\npchooks.lua
    8c8
    < function main() end
    ---
    > function update(dt) end
    
    scripts\api\objecthooks.lua
    11c11
    < function main() end
    ---
    > function update(dt) end
    
    species\humannamegen.config
    9a10,66
    > // "names" : [
    > // {"mode" : "alts"},
    > // [
    > // {"mode" : "serie"},
    > // [{"mode" : "alts"},
    > // "Morte",
    > // "Gari",
    > // "Acker",
    > // "Ale",
    > // "Bate",
    > // "Apple",
    > // "Ash",
    > // "Bake",
    > // "Bald",
    > // ""
    > // ],
    > // [{"mode" : "alts"},
    > // "berry",
    > // "bourne",
    > // "bund",
    > // "by",
    > // "den",
    > // "field",
    > // "ford",
    > // "grove",
    > // "ham",
    > // "ham",
    > // "man",
    > // "mer",
    > // "more",
    > // "ridge",
    > // "roy",
    > // // "s",
    > // // "sby",
    > // // "sley",
    > // // "slow",
    > // "son",
    > // "ster",
    > // "stine",
    > // "ton",
    > // "tram",
    > // "wald",
    > // "wale",
    > // "wall",
    > // "well",
    > // "win",
    > // "wood",
    > // "worth",
    > // "wright"
    > // ]
    > // ],
    > // [
    > // {"mode" : "serie"},
    > // [{"mode" : "alts"}, "Whit", "Glimmer", "Fenta"],
    > // [{"mode" : "alts"}, "bund", "more", "scue"]
    > // ]
    > // ]
    
    tech\automobile\car.lua
    2,3c2,3
    < data.active = false
    < data.fireTimer = 0
    ---
    > self.active = false
    > self.fireTimer = 0
    9c9
    < if data.active then
    ---
    > if self.active then
    11c11
    < tech.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]})
    ---
    > mcontroller.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]})
    13c13
    < data.active = false
    ---
    > self.active = false
    15c15
    < tech.setParentAppearance("normal")
    ---
    > tech.setParentState()
    17d16
    < tech.setParentFacingDirection(nil)
    23c22
    < if data.active then
    ---
    > if self.active then
    50,54c49,53
    < if not data.active and args.actions["mechActivate"] then
    < mechCollisionTest[1] = mechCollisionTest[1] + tech.position()[1]
    < mechCollisionTest[2] = mechCollisionTest[2] + tech.position()[2]
    < mechCollisionTest[3] = mechCollisionTest[3] + tech.position()[1]
    < mechCollisionTest[4] = mechCollisionTest[4] + tech.position()[2]
    ---
    > if not self.active and args.actions["mechActivate"] then
    > mechCollisionTest[1] = mechCollisionTest[1] + mcontroller.position()[1]
    > mechCollisionTest[2] = mechCollisionTest[2] + mcontroller.position()[2]
    > mechCollisionTest[3] = mechCollisionTest[3] + mcontroller.position()[1]
    > mechCollisionTest[4] = mechCollisionTest[4] + mcontroller.position()[2]
    57c56
    < tech.translate(mechTransformPositionChange)
    ---
    > mcontroller.translate(mechTransformPositionChange)
    59c58
    < tech.setParentAppearance("sit")
    ---
    > tech.setParentState("sit")
    61c60
    < data.active = true
    ---
    > self.active = true
    65c64
    < elseif data.active and (args.actions["mechDeactivate"] or energyCostPerSecond * args.dt > args.availableEnergy) then
    ---
    > elseif self.active and (args.actions["mechDeactivate"] or energyCostPerSecond * args.dt > args.availableEnergy) then
    67c66
    < tech.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]})
    ---
    > mcontroller.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]})
    69c68
    < tech.setParentAppearance("normal")
    ---
    > tech.setParentState()
    72c71
    < data.active = false
    ---
    > self.active = false
    75,77c74,75
    < tech.setParentFacingDirection(nil)
    < if data.active then
    < local diff = world.distance(args.aimPosition, tech.position())
    ---
    > if self.active then
    > local diff = world.distance(args.aimPosition, mcontroller.position())
    81c79
    < tech.applyMovementParameters(mechCustomMovementParameters)
    ---
    > mcontroller.controlParameters(mechCustomMovementParameters)
    86c84
    < tech.setParentFacingDirection(-1)
    ---
    > mcontroller.controlFace(-1)
    99c97
    < tech.setParentFacingDirection(1)
    ---
    > mcontroller.controlFace(1)
    110,111c108,109
    < if not tech.onGround() then
    < if tech.velocity()[2] > 0 then
    ---
    > if not mcontroller.onGround() then
    > if mcontroller.velocity()[2] > 0 then
    116,117c114,115
    < elseif tech.walking() or tech.running() then
    < if flip and tech.direction() == 1 or not flip and tech.direction() == -1 then
    ---
    > elseif mcontroller.walking() or mcontroller.running() then
    > if flip and mcontroller.direction() == 1 or not flip and mcontroller.direction() == -1 then
    127,129c125,127
    < if data.fireTimer <= 0 then
    < world.spawnProjectile(mechProjectile, vec2.add(tech.position(), tech.anchorPoint("frontGunFirePoint")), tech.parentEntityId(), {math.cos(aimAngle), math.sin(aimAngle)}, false, mechProjectileConfig)
    < data.fireTimer = data.fireTimer + mechFireCycle
    ---
    > if self.fireTimer <= 0 then
    > world.spawnProjectile(mechProjectile, vec2.add(mcontroller.position(), tech.anchorPoint("frontGunFirePoint")), entity.id(), {math.cos(aimAngle), math.sin(aimAngle)}, false, mechProjectileConfig)
    > self.fireTimer = self.fireTimer + mechFireCycle
    132,135c130,133
    < local oldFireTimer = data.fireTimer
    < data.fireTimer = data.fireTimer - args.dt
    < if oldFireTimer > mechFireCycle / 2 and data.fireTimer <= mechFireCycle / 2 then
    < world.spawnProjectile(mechProjectile, vec2.add(tech.position(), tech.anchorPoint("backGunFirePoint")), tech.parentEntityId(), {math.cos(aimAngle), math.sin(aimAngle)}, false, mechProjectileConfig)
    ---
    > local oldFireTimer = self.fireTimer
    > self.fireTimer = self.fireTimer - args.dt
    > if oldFireTimer > mechFireCycle / 2 and self.fireTimer <= mechFireCycle / 2 then
    > world.spawnProjectile(mechProjectile, vec2.add(mcontroller.position(), tech.anchorPoint("backGunFirePoint")), entity.id(), {math.cos(aimAngle), math.sin(aimAngle)}, false, mechProjectileConfig)
    
    tech\automobile\car\humancar.tech
    17,18c17
    < "ambulatingGroundFriction" : 6.0,
    < "skiddingGroundFriction" : 10.0,
    ---
    > "ambulatingGroundFriction" : 6.0
    
    tech\blink\blink.lua
    2,6c2,6
    < local collisionBounds = tech.collisionBounds()
    < collisionBounds[1] = collisionBounds[1] - tech.position()[1] + position[1]
    < collisionBounds[2] = collisionBounds[2] - tech.position()[2] + position[2]
    < collisionBounds[3] = collisionBounds[3] - tech.position()[1] + position[1]
    < collisionBounds[4] = collisionBounds[4] - tech.position()[2] + position[2]
    ---
    > local boundBox = mcontroller.boundBox()
    > boundBox[1] = boundBox[1] - mcontroller.position()[1] + position[1]
    > boundBox[2] = boundBox[2] - mcontroller.position()[2] + position[2]
    > boundBox[3] = boundBox[3] - mcontroller.position()[1] + position[1]
    > boundBox[4] = boundBox[4] - mcontroller.position()[2] + position[2]
    8c8
    < return not world.rectCollision(collisionBounds)
    ---
    > return not world.rectCollision(boundBox)
    17c17
    < local collisionBlocks = world.collisionBlocksAlongLine(tech.position(), position, true, 1)
    ---
    > local collisionBlocks = world.collisionBlocksAlongLine(mcontroller.position(), position, true, 1)
    19c19
    < local diff = world.distance(position, tech.position())
    ---
    > local diff = world.distance(position, mcontroller.position())
    77c77
    < if doLiquidCheck and (world.liquidAt(position) or world.liquidAt({position[1], position[2] + blinkFootOffset})) then
    ---
    > if doLiquidCheck and (world.visibleLiquidAt(position) or world.visibleLiquidAt({position[1], position[2] + blinkFootOffset})) then
    93c93
    < local position = tech.position()
    ---
    > local position = mcontroller.position()
    107,109c107,109
    < data.mode = "none"
    < data.timer = 0
    < data.targetPosition = nil
    ---
    > self.mode = "none"
    > self.timer = 0
    > self.targetPosition = nil
    113c113
    < tech.setParentAppearance("normal")
    ---
    > tech.setParentDirectives()
    130c130
    < if args.actions["blink"] and data.mode == "none" and args.availableEnergy > energyUsage then
    ---
    > if args.actions["blink"] and self.mode == "none" and args.availableEnergy > energyUsage then
    148,149c148,149
    < data.targetPosition = blinkPosition
    < data.mode = "start"
    ---
    > self.targetPosition = blinkPosition
    > self.mode = "start"
    155,158c155,158
    < if data.mode == "start" then
    < tech.setVelocity({0, 0})
    < data.mode = "out"
    < data.timer = 0
    ---
    > if self.mode == "start" then
    > mcontroller.setVelocity({0, 0})
    > self.mode = "out"
    > self.timer = 0
    161,162c161,162
    < elseif data.mode == "out" then
    < tech.setParentAppearance("hidden")
    ---
    > elseif self.mode == "out" then
    > tech.setParentDirectives("?multiply=00000000")
    164,165c164,165
    < tech.setVelocity({0, 0})
    < data.timer = data.timer + args.dt
    ---
    > mcontroller.setVelocity({0, 0})
    > self.timer = self.timer + args.dt
    167,170c167,170
    < if data.timer > blinkOutTime then
    < tech.setPosition(data.targetPosition)
    < data.mode = "in"
    < data.timer = 0
    ---
    > if self.timer > blinkOutTime then
    > mcontroller.setPosition(self.targetPosition)
    > self.mode = "in"
    > self.timer = 0
    174,175c174,175
    < elseif data.mode == "in" then
    < tech.setParentAppearance("normal")
    ---
    > elseif self.mode == "in" then
    > tech.setParentDirectives()
    177,178c177,178
    < tech.setVelocity({0, 0})
    < data.timer = data.timer + args.dt
    ---
    > mcontroller.setVelocity({0, 0})
    > self.timer = self.timer + args.dt
    180,181c180,181
    < if data.timer > blinkInTime then
    < data.mode = "none"
    ---
    > if self.timer > blinkInTime then
    > self.mode = "none"
    
    tech\booster\booster.lua
    2,4c2,4
    < data.lastJump = false
    < data.lastBoost = nil
    < data.ranOut = false
    ---
    > self.lastJump = false
    > self.lastBoost = nil
    > self.ranOut = false
    11,12c11,12
    < if not tech.onGround() then
    < if not tech.canJump() and currentJump and not data.lastJump then
    ---
    > if not mcontroller.onGround() then
    > if not mcontroller.canJump() and currentJump and not self.lastJump then
    30,31c30,31
    < elseif currentJump and data.lastBoost then
    < currentBoost = data.lastBoost
    ---
    > elseif currentJump and self.lastBoost then
    > currentBoost = self.lastBoost
    35,36c35,36
    < data.lastJump = currentJump
    < data.lastBoost = currentBoost
    ---
    > self.lastJump = currentJump
    > self.lastBoost = currentBoost
    48,50c48,50
    < data.ranOut = true
    < elseif tech.onGround() or tech.inLiquid() then
    < data.ranOut = false
    ---
    > self.ranOut = true
    > elseif mcontroller.onGround() or mcontroller.inLiquid() then
    > self.ranOut = false
    56c56
    < if not data.ranOut then
    ---
    > if not self.ranOut then
    59c59
    < tech.control({boostSpeed * diag, boostSpeed * diag}, boostControlForce, true, true)
    ---
    > mcontroller.controlApproachVelocity({boostSpeed * diag, boostSpeed * diag}, boostControlForce, true, true)
    61c61
    < tech.control({boostSpeed * diag, -boostSpeed * diag}, boostControlForce, true, true)
    ---
    > mcontroller.controlApproachVelocity({boostSpeed * diag, -boostSpeed * diag}, boostControlForce, true, true)
    63c63
    < tech.control({-boostSpeed * diag, boostSpeed * diag}, boostControlForce, true, true)
    ---
    > mcontroller.controlApproachVelocity({-boostSpeed * diag, boostSpeed * diag}, boostControlForce, true, true)
    65c65
    < tech.control({-boostSpeed * diag, -boostSpeed * diag}, boostControlForce, true, true)
    ---
    > mcontroller.controlApproachVelocity({-boostSpeed * diag, -boostSpeed * diag}, boostControlForce, true, true)
    67c67
    < tech.control({boostSpeed, 0}, boostControlForce, true, true)
    ---
    > mcontroller.controlApproachVelocity({boostSpeed, 0}, boostControlForce, true, true)
    69c69
    < tech.control({0, -boostSpeed}, boostControlForce, true, true)
    ---
    > mcontroller.controlApproachVelocity({0, -boostSpeed}, boostControlForce, true, true)
    71c71
    < tech.control({-boostSpeed, 0}, boostControlForce, true, true)
    ---
    > mcontroller.controlApproachVelocity({-boostSpeed, 0}, boostControlForce, true, true)
    73c73
    < tech.control({0, boostSpeed}, boostControlForce, true, true)
    ---
    > mcontroller.controlApproachVelocity({0, boostSpeed}, boostControlForce, true, true)
    
    tech\dash\dash.lua
    2,7c2,7
    < data.airDashing = false
    < data.dashTimer = 0
    < data.dashDirection = 0
    < data.dashLastInput = 0
    < data.dashTapLast = 0
    < data.dashTapTimer = 0
    ---
    > self.airDashing = false
    > self.dashTimer = 0
    > self.dashDirection = 0
    > self.dashLastInput = 0
    > self.dashTapLast = 0
    > self.dashTapTimer = 0
    11c11
    < if data.dashTimer > 0 then
    ---
    > if self.dashTimer > 0 then
    17,18c17,18
    < if data.dashTapTimer > 0 then
    < data.dashTapTimer = data.dashTapTimer - args.dt
    ---
    > if self.dashTapTimer > 0 then
    > self.dashTapTimer = self.dashTapTimer - args.dt
    22,25c22,25
    < if data.dashLastInput ~= 1 then
    < if data.dashTapLast == 1 and data.dashTapTimer > 0 then
    < data.dashTapLast = 0
    < data.dashTapTimer = 0
    ---
    > if self.dashLastInput ~= 1 then
    > if self.dashTapLast == 1 and self.dashTapTimer > 0 then
    > self.dashTapLast = 0
    > self.dashTapTimer = 0
    28,29c28,29
    < data.dashTapLast = 1
    < data.dashTapTimer = maximumDoubleTapTime
    ---
    > self.dashTapLast = 1
    > self.dashTapTimer = maximumDoubleTapTime
    32c32
    < data.dashLastInput = 1
    ---
    > self.dashLastInput = 1
    34,37c34,37
    < if data.dashLastInput ~= -1 then
    < if data.dashTapLast == -1 and data.dashTapTimer > 0 then
    < data.dashTapLast = 0
    < data.dashTapTimer = 0
    ---
    > if self.dashLastInput ~= -1 then
    > if self.dashTapLast == -1 and self.dashTapTimer > 0 then
    > self.dashTapLast = 0
    > self.dashTapTimer = 0
    40,41c40,41
    < data.dashTapLast = -1
    < data.dashTapTimer = maximumDoubleTapTime
    ---
    > self.dashTapLast = -1
    > self.dashTapTimer = maximumDoubleTapTime
    44c44
    < data.dashLastInput = -1
    ---
    > self.dashLastInput = -1
    46c46
    < data.dashLastInput = 0
    ---
    > self.dashLastInput = 0
    59,61c59,61
    < if args.actions["dashRight"] and data.dashTimer <= 0 and args.availableEnergy > energyUsage then
    < data.dashTimer = dashDuration
    < data.dashDirection = 1
    ---
    > if args.actions["dashRight"] and self.dashTimer <= 0 and args.availableEnergy > energyUsage then
    > self.dashTimer = dashDuration
    > self.dashDirection = 1
    63,66c63,66
    < data.airDashing = not tech.onGround()
    < elseif args.actions["dashLeft"] and data.dashTimer <= 0 and args.availableEnergy > energyUsage then
    < data.dashTimer = dashDuration
    < data.dashDirection = -1
    ---
    > self.airDashing = not mcontroller.onGround()
    > elseif args.actions["dashLeft"] and self.dashTimer <= 0 and args.availableEnergy > energyUsage then
    > self.dashTimer = dashDuration
    > self.dashDirection = -1
    68c68
    < data.airDashing = not tech.onGround()
    ---
    > self.airDashing = not mcontroller.onGround()
    71,72c71,72
    < if data.dashTimer > 0 then
    < tech.xControl(dashSpeed * data.dashDirection, dashControlForce, true)
    ---
    > if self.dashTimer > 0 then
    > mcontroller.controlApproachXVelocity(dashSpeed * self.dashDirection, dashControlForce, true)
    74,76c74,76
    < if data.airDashing then
    < tech.applyMovementParameters({gravityEnabled = false})
    < tech.yControl(0, dashControlForce, true)
    ---
    > if self.airDashing then
    > mcontroller.controlParameters({gravityEnabled = false})
    > mcontroller.controlApproachYVelocity(0, dashControlForce, true)
    79,80c79,80
    < if data.dashDirection == -1 then
    < tech.moveLeft()
    ---
    > if self.dashDirection == -1 then
    > mcontroller.controlFace(-1)
    83c83
    < tech.moveRight()
    ---
    > mcontroller.controlFace(1)
    88c88
    < data.dashTimer = data.dashTimer - args.dt
    ---
    > self.dashTimer = self.dashTimer - args.dt
    
    tech\jeep\jeep\humanjeep.tech
    16,17c16
    < "ambulatingGroundFriction" : 6.0,
    < "skiddingGroundFriction" : 10.0,
    ---
    > "ambulatingGroundFriction" : 6.0
    
    tech\jetpack\jetpack.lua
    2,3c2,3
    < data.holdingJump = false
    < data.ranOut = false
    ---
    > self.holdingJump = false
    > self.ranOut = false
    7,8c7,8
    < if args.moves["jump"] and tech.jumping() then
    < data.holdingJump = true
    ---
    > if args.moves["jump"] and mcontroller.jumping() then
    > self.holdingJump = true
    10c10
    < data.holdingJump = false
    ---
    > self.holdingJump = false
    13c13
    < if args.moves["jump"] and not tech.canJump() and not data.holdingJump then
    ---
    > if args.moves["jump"] and not mcontroller.canJump() and not self.holdingJump then
    27,29c27,29
    < data.ranOut = true
    < elseif tech.onGround() or tech.inLiquid() then
    < data.ranOut = false
    ---
    > self.ranOut = true
    > elseif mcontroller.onGround() or mcontroller.inLiquid() then
    > self.ranOut = false
    32c32
    < if args.actions["jetpack"] and not data.ranOut then
    ---
    > if args.actions["jetpack"] and not self.ranOut then
    34c34
    < tech.yControl(jetpackSpeed, jetpackControlForce, true)
    ---
    > mcontroller.controlApproachYVelocity(jetpackSpeed, jetpackControlForce, true)
    
    tech\mech\mech.lua
    2,3c2,3
    < data.active = false
    < data.fireTimer = 0
    ---
    > self.active = false
    > self.fireTimer = 0
    9c9
    < if data.active then
    ---
    > if self.active then
    11c11
    < tech.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]})
    ---
    > mcontroller.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]})
    13c13
    < data.active = false
    ---
    > self.active = false
    15c15
    < tech.setParentAppearance("normal")
    ---
    > tech.setParentState()
    17d16
    < tech.setParentFacingDirection(nil)
    23c22
    < if data.active then
    ---
    > if self.active then
    50,54c49,53
    < if not data.active and args.actions["mechActivate"] then
    < mechCollisionTest[1] = mechCollisionTest[1] + tech.position()[1]
    < mechCollisionTest[2] = mechCollisionTest[2] + tech.position()[2]
    < mechCollisionTest[3] = mechCollisionTest[3] + tech.position()[1]
    < mechCollisionTest[4] = mechCollisionTest[4] + tech.position()[2]
    ---
    > if not self.active and args.actions["mechActivate"] then
    > mechCollisionTest[1] = mechCollisionTest[1] + mcontroller.position()[1]
    > mechCollisionTest[2] = mechCollisionTest[2] + mcontroller.position()[2]
    > mechCollisionTest[3] = mechCollisionTest[3] + mcontroller.position()[1]
    > mechCollisionTest[4] = mechCollisionTest[4] + mcontroller.position()[2]
    57c56
    < tech.translate(mechTransformPositionChange)
    ---
    > mcontroller.translate(mechTransformPositionChange)
    59c58
    < tech.setParentAppearance("sit")
    ---
    > tech.setParentState("sit")
    61c60
    < data.active = true
    ---
    > self.active = true
    65c64
    < elseif data.active and (args.actions["mechDeactivate"] or energyCostPerSecond * args.dt > args.availableEnergy) then
    ---
    > elseif self.active and (args.actions["mechDeactivate"] or energyCostPerSecond * args.dt > args.availableEnergy) then
    67c66
    < tech.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]})
    ---
    > mcontroller.translate({-mechTransformPositionChange[1], -mechTransformPositionChange[2]})
    69c68
    < tech.setParentAppearance("normal")
    ---
    > tech.setParentState()
    72c71
    < data.active = false
    ---
    > self.active = false
    75,77c74,75
    < tech.setParentFacingDirection(nil)
    < if data.active then
    < local diff = world.distance(args.aimPosition, tech.position())
    ---
    > if self.active then
    > local diff = world.distance(args.aimPosition, mcontroller.position())
    81c79
    < tech.applyMovementParameters(mechCustomMovementParameters)
    ---
    > mcontroller.controlParameters(mechCustomMovementParameters)
    86c84
    < tech.setParentFacingDirection(-1)
    ---
    > mcontroller.controlFace(-1)
    99c97
    < tech.setParentFacingDirection(1)
    ---
    > mcontroller.controlFace(1)
    110,111c108,109
    < if not tech.onGround() then
    < if tech.velocity()[2] > 0 then
    ---
    > if not mcontroller.onGround() then
    > if mcontroller.velocity()[2] > 0 then
    116,117c114,115
    < elseif tech.walking() or tech.running() then
    < if flip and tech.direction() == 1 or not flip and tech.direction() == -1 then
    ---
    > elseif mcontroller.walking() or mcontroller.running() then
    > if flip and mcontroller.movingDirection() == 1 or not flip and mcontroller.movingDirection() == -1 then
    127,129c125,127
    < if data.fireTimer <= 0 then
    < world.spawnProjectile(mechProjectile, vec2.add(tech.position(), tech.anchorPoint("frontGunFirePoint")), tech.parentEntityId(), {math.cos(aimAngle), math.sin(aimAngle)}, false, mechProjectileConfig)
    < data.fireTimer = data.fireTimer + mechFireCycle
    ---
    > if self.fireTimer <= 0 then
    > world.spawnProjectile(mechProjectile, vec2.add(mcontroller.position(), tech.anchorPoint("frontGunFirePoint")), entity.id(), {math.cos(aimAngle), math.sin(aimAngle)}, false, mechProjectileConfig)
    > self.fireTimer = self.fireTimer + mechFireCycle
    132,135c130,133
    < local oldFireTimer = data.fireTimer
    < data.fireTimer = data.fireTimer - args.dt
    < if oldFireTimer > mechFireCycle / 2 and data.fireTimer <= mechFireCycle / 2 then
    < world.spawnProjectile(mechProjectile, vec2.add(tech.position(), tech.anchorPoint("backGunFirePoint")), tech.parentEntityId(), {math.cos(aimAngle), math.sin(aimAngle)}, false, mechProjectileConfig)
    ---
    > local oldFireTimer = self.fireTimer
    > self.fireTimer = self.fireTimer - args.dt
    > if oldFireTimer > mechFireCycle / 2 and self.fireTimer <= mechFireCycle / 2 then
    > world.spawnProjectile(mechProjectile, vec2.add(mcontroller.position(), tech.anchorPoint("backGunFirePoint")), entity.id(), {math.cos(aimAngle), math.sin(aimAngle)}, false, mechProjectileConfig)
    
    tech\mech\apexmech\apexmech.tech
    18d17
    < "skiddingGroundFriction" : 10.0,
    
    tech\mech\glitchmech\glitchmech.tech
    17,18c17
    < "ambulatingGroundFriction" : 6.0,
    < "skiddingGroundFriction" : 10.0,
    ---
    > "ambulatingGroundFriction" : 6.0
    
    tech\mech\humanmech\humanmech.tech
    17,18c17
    < "ambulatingGroundFriction" : 6.0,
    < "skiddingGroundFriction" : 10.0,
    ---
    > "ambulatingGroundFriction" : 6.0
    
    tech\morphball\morphball.lua
    2,6c2,6
    < data.specialLast = false
    < data.primaryFireLast = false
    < data.angularVelocity = 0
    < data.angle = 0
    < data.active = false
    ---
    > self.specialLast = false
    > self.primaryFireLast = false
    > self.angularVelocity = 0
    > self.angle = 0
    > self.active = false
    11c11
    < if data.active then
    ---
    > if self.active then
    13,14c13,14
    < tech.translate({0, -tech.parameter("ballTransformHeightChange")})
    < tech.setParentAppearance("normal")
    ---
    > mcontroller.translate({0, -tech.parameter("ballTransformHeightChange")})
    > tech.setParentDirectives()
    16c16
    < data.active = false
    ---
    > self.active = false
    22,23c22,23
    < if args.moves["special"] == 1 and not data.specialLast then
    < if data.active then
    ---
    > if args.moves["special"] == 1 and not self.specialLast then
    > if self.active then
    28c28
    < elseif data.active and args.moves["primaryFire"] and not data.primaryFireLast then
    ---
    > elseif self.active and args.moves["primaryFire"] and not self.primaryFireLast then
    32,33c32,33
    < data.specialLast = args.moves["special"] == 1
    < data.primaryFireLast = args.moves["primaryFire"]
    ---
    > self.specialLast = args.moves["special"] == 1
    > self.primaryFireLast = args.moves["primaryFire"]
    47c47
    < if not data.active and args.actions["morphballActivate"] then
    ---
    > if not self.active and args.actions["morphballActivate"] then
    50,51c50,51
    < tech.translate({0, ballTransformHeightChange})
    < tech.setParentAppearance("hidden")
    ---
    > mcontroller.translate({0, ballTransformHeightChange})
    > tech.setParentDirectives("?multiply=00000000")
    53,58c53,58
    < data.active = true
    < elseif data.active and (args.actions["morphballDeactivate"] or energyCostPerSecond * args.dt > args.availableEnergy) then
    < ballDeactivateCollisionTest[1] = ballDeactivateCollisionTest[1] + tech.position()[1]
    < ballDeactivateCollisionTest[2] = ballDeactivateCollisionTest[2] + tech.position()[2]
    < ballDeactivateCollisionTest[3] = ballDeactivateCollisionTest[3] + tech.position()[1]
    < ballDeactivateCollisionTest[4] = ballDeactivateCollisionTest[4] + tech.position()[2]
    ---
    > self.active = true
    > elseif self.active and (args.actions["morphballDeactivate"] or energyCostPerSecond * args.dt > args.availableEnergy) then
    > ballDeactivateCollisionTest[1] = ballDeactivateCollisionTest[1] + mcontroller.position()[1]
    > ballDeactivateCollisionTest[2] = ballDeactivateCollisionTest[2] + mcontroller.position()[2]
    > ballDeactivateCollisionTest[3] = ballDeactivateCollisionTest[3] + mcontroller.position()[1]
    > ballDeactivateCollisionTest[4] = ballDeactivateCollisionTest[4] + mcontroller.position()[2]
    62,63c62,63
    < tech.translate({0, -ballTransformHeightChange})
    < tech.setParentAppearance("normal")
    ---
    > mcontroller.translate({0, -ballTransformHeightChange})
    > tech.setParentDirectives()
    65,66c65,66
    < data.angle = 0
    < data.active = false
    ---
    > self.angle = 0
    > self.active = false
    72,73c72,73
    < if data.active then
    < tech.applyMovementParameters(ballCustomMovementParameters)
    ---
    > if self.active then
    > mcontroller.controlParameters(ballCustomMovementParameters)
    75c75
    < if tech.onGround() then
    ---
    > if mcontroller.onGround() then
    78c78
    < data.angularVelocity = -tech.measuredVelocity()[1] / ballRadius
    ---
    > self.angularVelocity = -mcontroller.measuredVelocity()[1] / ballRadius
    81c81
    < data.angle = math.fmod(math.pi * 2 + data.angle + data.angularVelocity * args.dt, math.pi * 2)
    ---
    > self.angle = math.fmod(math.pi * 2 + self.angle + self.angularVelocity * args.dt, math.pi * 2)
    85c85
    < local rotationFrame = math.floor(data.angle / math.pi * ballFrames) % ballFrames
    ---
    > local rotationFrame = math.floor(self.angle / math.pi * ballFrames) % ballFrames
    89c89
    < world.spawnProjectile(ballBombProjectile, tech.position(), tech.parentEntityId())
    ---
    > world.spawnProjectile(ballBombProjectile, mcontroller.position(), entity.id())
    
    tech\multijump\multijump.lua
    2,3c2,3
    < data.multiJumps = 0
    < data.lastJump = false
    ---
    > self.multiJumps = 0
    > self.lastJump = false
    7,8c7,8
    < if args.moves["jump"] and not tech.jumping() and not tech.canJump() and not data.lastJump then
    < data.lastJump = true
    ---
    > if args.moves["jump"] and not mcontroller.jumping() and not mcontroller.canJump() and not self.lastJump then
    > self.lastJump = true
    11c11
    < data.lastJump = args.moves["jump"]
    ---
    > self.lastJump = args.moves["jump"]
    20,22c20,22
    < if args.actions["multiJump"] and data.multiJumps < multiJumpCount and args.availableEnergy > energyUsage then
    < tech.jump(true)
    < data.multiJumps = data.multiJumps + 1
    ---
    > if args.actions["multiJump"] and self.multiJumps < multiJumpCount and args.availableEnergy > energyUsage then
    > mcontroller.controlJump(true)
    > self.multiJumps = self.multiJumps + 1
    27,28c27,28
    < if tech.onGround() or tech.inLiquid() then
    < data.multiJumps = 0
    ---
    > if mcontroller.onGround() or mcontroller.inLiquid() then
    > self.multiJumps = 0
    
    tech\skyrail\skyrail.lua
    43,44c43,44
    < data.inputAction = { false, false, false, false, false, false }
    < data.lastAction = { false, false, false, false, false, false }
    ---
    > self.inputAction = { false, false, false, false, false, false }
    > self.lastAction = { false, false, false, false, false, false }
    47c47
    < data.active = false --Tech On/Off
    ---
    > self.active = false --Tech On/Off
    51,54c51,54
    < data.onRail = false
    < data.direction = 0 --Direction of motion (-1 = left, +1 = right 0 = still)
    < data.speed = 0 --Speed of motion, should always be +tive.
    < data.currentRail = nil --Current rail object:
    ---
    > self.onRail = false
    > self.direction = 0 --Direction of motion (-1 = left, +1 = right 0 = still)
    > self.speed = 0 --Speed of motion, should always be +tive.
    > self.currentRail = nil --Current rail object:
    57,61c57,61
    < data.leaveTimer = 0 --Timer triggered to prevent immediate re-attaching to rails after jumping.
    < data.railSearchOrder = "MBT" --Priority of rail neighbours when moving from one rail to another (M=Middle, B=Bottom, T=Top).
    < data.resetRailSearchOrder = true --Used to mark if default railSearchOrder has been overidden by a special rail type
    < data.maxspeed = 60 --Default maxspeed (should be overidden before use)
    < data.acceleration = 15 --Default acceleration (should be overidden before use)
    ---
    > self.leaveTimer = 0 --Timer triggered to prevent immediate re-attaching to rails after jumping.
    > self.railSearchOrder = "MBT" --Priority of rail neighbours when moving from one rail to another (M=Middle, B=Bottom, T=Top).
    > self.resetRailSearchOrder = true --Used to mark if default railSearchOrder has been overidden by a special rail type
    > self.maxspeed = 60 --Default maxspeed (should be overidden before use)
    > self.acceleration = 15 --Default acceleration (should be overidden before use)
    90,91c90,91
    < if move and not data.lastAction[moveIndex] then
    < data.inputAction[moveIndex] = true
    ---
    > if move and not self.lastAction[moveIndex] then
    > self.inputAction[moveIndex] = true
    93c93
    < data.lastAction[moveIndex] = move and pressOnly
    ---
    > self.lastAction[moveIndex] = move and pressOnly
    97c97
    < data.inputAction = { false, false, false, false, false, false }
    ---
    > self.inputAction = { false, false, false, false, false, false }
    106,108c106,108
    < if data.inputAction[IA_SPECIAL] then
    < data.active = not data.active
    < if data.onRail then
    ---
    > if self.inputAction[IA_SPECIAL] then
    > self.active = not self.active
    > if self.onRail then
    113c113
    < if data.active then
    ---
    > if self.active then
    115c115
    < if data.onRail then
    ---
    > if self.onRail then
    130,131c130,131
    < if data.leaveTimer > 0 then
    < data.leaveTimer = data.leaveTimer - args.dt
    ---
    > if self.leaveTimer > 0 then
    > self.leaveTimer = self.leaveTimer - args.dt
    138c138
    < local hookX = { tech.position()[1] + hookOffset[1], tech.position()[2] + hookOffset[2]}
    ---
    > local hookX = { mcontroller.position()[1] + hookOffset[1], mcontroller.position()[2] + hookOffset[2]}
    145,146c145,146
    < data.leaveTimer = 0
    < local velocity = tech.measuredVelocity()
    ---
    > self.leaveTimer = 0
    > local velocity = mcontroller.measuredVelocity()
    166c166
    < if data.inputAction[IA_JUMP] then
    ---
    > if self.inputAction[IA_JUMP] then
    168,170c168,170
    < data.leaveTimer = tech.parameter("railLeaveTime");
    < if not data.inputAction[IA_DOWN] then
    < tech.jump(true)
    ---
    > self.leaveTimer = tech.parameter("railLeaveTime");
    > if not self.inputAction[IA_DOWN] then
    > mcontroller.controlJump(true)
    176,179c176,179
    < if data.inputAction[IA_UP] then
    < data.railSearchOrder = "TMB"
    < elseif data.inputAction[IA_DOWN] then
    < data.railSearchOrder = "BMT"
    ---
    > if self.inputAction[IA_UP] then
    > self.railSearchOrder = "TMB"
    > elseif self.inputAction[IA_DOWN] then
    > self.railSearchOrder = "BMT"
    181,182c181,182
    < if data.resetRailSearchOrder == true then
    < data.railSearchOrder = "MBT"
    ---
    > if self.resetRailSearchOrder == true then
    > self.railSearchOrder = "MBT"
    184c184
    < data.resetRailSearchOrder = true
    ---
    > self.resetRailSearchOrder = true
    191c191
    < if data.onRail then
    ---
    > if self.onRail then
    195c195
    < update_preapplyRailSurface(args,surfaces[data.currentRail.Type])
    ---
    > update_preapplyRailSurface(args,surfaces[self.currentRail.Type])
    198,203c198,203
    < if data.inputAction[IA_LEFT] then
    < update_railSpeed(-data.acceleration * args.dt)
    < tech.control({0,0},0,true,true)
    < elseif data.inputAction[IA_RIGHT] then
    < update_railSpeed(data.acceleration * args.dt)
    < tech.control({0,0},0,true,true)
    ---
    > if self.inputAction[IA_LEFT] then
    > update_railSpeed(-self.acceleration * args.dt)
    > mcontroller.controlApproachVelocity({0,0},0,true,true)
    > elseif self.inputAction[IA_RIGHT] then
    > update_railSpeed(self.acceleration * args.dt)
    > mcontroller.controlApproachVelocity({0,0},0,true,true)
    207c207
    < update_postapplyRailSurface(args,surfaces[data.currentRail.Type])
    ---
    > update_postapplyRailSurface(args,surfaces[self.currentRail.Type])
    221,224c221,224
    < if world.magnitude(tech.measuredVelocity()) < minspeed then
    < if data.speed > bouncespeed then
    < data.direction = -data.direction
    < data.speed = data.speed * bouncefactor
    ---
    > if world.magnitude(mcontroller.measuredVelocity()) < minspeed then
    > if self.speed > bouncespeed then
    > self.direction = -self.direction
    > self.speed = self.speed * bouncefactor
    233c233
    < local hookX = { tech.position()[1] + hookOffset[1], tech.position()[2] + hookOffset[2]}
    ---
    > local hookX = { mcontroller.position()[1] + hookOffset[1], mcontroller.position()[2] + hookOffset[2]}
    239c239
    < if nrails <= 0 or data.currentRail == nil then
    ---
    > if nrails <= 0 or self.currentRail == nil then
    245c245
    < if not railListContains(rails,data.currentRail) then
    ---
    > if not railListContains(rails,self.currentRail) then
    247,248c247,248
    < leftRails = getOverheadNeighboursFromRail(data.currentRail,-1)
    < rightRails = getOverheadNeighboursFromRail(data.currentRail,1)
    ---
    > leftRails = getOverheadNeighboursFromRail(self.currentRail,-1)
    > rightRails = getOverheadNeighboursFromRail(self.currentRail,1)
    256,258c256,258
    < --world.logInfo("LN: " .. data.railSearchOrder)
    < bestNeighbour = getBestNeighbour(data.currentRail.Left, data.railSearchOrder)
    < data.currentRail = leftRails[bestNeighbour.yOffset + 2]
    ---
    > --world.logInfo("LN: " .. self.railSearchOrder)
    > bestNeighbour = getBestNeighbour(self.currentRail.Left, self.railSearchOrder)
    > self.currentRail = leftRails[bestNeighbour.yOffset + 2]
    265,267c265,267
    < --world.logInfo("RN" .. data.railSearchOrder)
    < bestNeighbour = getBestNeighbour(data.currentRail.Right, data.railSearchOrder)
    < data.currentRail = rightRails[bestNeighbour.yOffset + 2]
    ---
    > --world.logInfo("RN" .. self.railSearchOrder)
    > bestNeighbour = getBestNeighbour(self.currentRail.Right, self.railSearchOrder)
    > self.currentRail = rightRails[bestNeighbour.yOffset + 2]
    271c271
    < local char = data.railSearchOrder:sub(1,1)
    ---
    > local char = self.railSearchOrder:sub(1,1)
    273c273
    < data.currentRail = rails[1]
    ---
    > self.currentRail = rails[1]
    275c275
    < data.currentRail = rails[math.ceil(nrails / 2)]
    ---
    > self.currentRail = rails[math.ceil(nrails / 2)]
    277c277
    < data.currentRail = rails[nrails]
    ---
    > self.currentRail = rails[nrails]
    287,288c287,288
    < if k=="maxSpeed" then data.maxspeed = v --Set max speed
    < elseif k=="acceleration" then data.acceleration = v --Set acceleration
    ---
    > if k=="maxSpeed" then self.maxspeed = v --Set max speed
    > elseif k=="acceleration" then self.acceleration = v --Set acceleration
    290,291c290,291
    < data.railSearchOrder = v --Set rail search order
    < data.resetRailSearchOrder = false --Prevent holding no keys from resetting SO
    ---
    > self.railSearchOrder = v --Set rail search order
    > self.resetRailSearchOrder = false --Prevent holding no keys from resetting SO
    300c300
    < data.speed = data.speed + (data.speed * v - data.speed) * args.dt
    ---
    > self.speed = self.speed + (self.speed * v - self.speed) * args.dt
    302c302
    < data.speed = data.speed * v
    ---
    > self.speed = self.speed * v
    304c304
    < if v[1] == data.direction then data.speed = data.speed * v[2] end
    ---
    > if v[1] == self.direction then self.speed = self.speed * v[2] end
    306c306
    < data.speed = dataspeed + v * args.dt
    ---
    > self.speed = dataspeed + v * args.dt
    308c308
    < data.speed = v
    ---
    > self.speed = v
    310c310
    < data.direction = v
    ---
    > self.direction = v
    319c319
    < data.speed = data.speed + acceleration * data.direction
    ---
    > self.speed = self.speed + acceleration * self.direction
    321,323c321,323
    < if data.speed < minspeed then
    < data.speed = minspeed
    < data.direction = -data.direction
    ---
    > if self.speed < minspeed then
    > self.speed = minspeed
    > self.direction = -self.direction
    332c332
    < local gravity = world.gravity(tech.position());
    ---
    > local gravity = world.gravity(mcontroller.position());
    334c334
    < local hookX = { tech.position()[1] + hookOffset[1], tech.position()[2] + hookOffset[2]}
    ---
    > local hookX = { mcontroller.position()[1] + hookOffset[1], mcontroller.position()[2] + hookOffset[2]}
    337c337
    < local grad = getRailGradient(data.currentRail,data.direction,data.railSearchOrder)
    ---
    > local grad = getRailGradient(self.currentRail,self.direction,self.railSearchOrder)
    340c340
    < data.speed = data.speed - gravity * grad * ir2 * args.dt
    ---
    > self.speed = self.speed - gravity * grad * ir2 * args.dt
    343,346c343,346
    < if data.speed < minspeed then
    < data.speed = minspeed
    < elseif data.speed > data.maxspeed then
    < data.speed = data.maxspeed
    ---
    > if self.speed < minspeed then
    > self.speed = minspeed
    > elseif self.speed > self.maxspeed then
    > self.speed = self.maxspeed
    352,353c352,353
    < tech.setXVelocity(data.speed * data.direction)
    < tech.setYVelocity(0)
    ---
    > mcontroller.setXVelocity(self.speed * self.direction)
    > mcontroller.setYVelocity(0)
    355,356c355,356
    < tech.setXVelocity(data.speed * data.direction * ir2)
    < tech.setYVelocity(data.speed * grad * ir2)
    ---
    > mcontroller.setXVelocity(self.speed * self.direction * ir2)
    > mcontroller.setYVelocity(self.speed * grad * ir2)
    360,361c360,361
    < local dx = hookX[1]- data.currentRail.Position[1] --sub-tile x position along railing
    < local ypos = data.currentRail.Position[2] - hookOffset[2] --y position for snapping to railing
    ---
    > local dx = hookX[1]- self.currentRail.Position[1] --sub-tile x position along railing
    > local ypos = self.currentRail.Position[2] - hookOffset[2] --y position for snapping to railing
    363c363
    < if data.direction < 0 then
    ---
    > if self.direction < 0 then
    373c373
    < tech.setPosition({tech.position()[1],ypos})
    ---
    > mcontroller.setPosition({mcontroller.position()[1],ypos})
    388,391c388,391
    < data.onRail = true
    < data.direction =0
    < data.speed =0
    < data.currentRail = rail
    ---
    > self.onRail = true
    > self.direction =0
    > self.speed =0
    > self.currentRail = rail
    394c394
    < local vel = tech.measuredVelocity()
    ---
    > local vel = mcontroller.measuredVelocity()
    396c396
    < data.direction = 1
    ---
    > self.direction = 1
    398c398
    < data.direction = -1
    ---
    > self.direction = -1
    402c402
    < local grad = getRailGradient(rail,data.direction,searchOrder)
    ---
    > local grad = getRailGradient(rail,self.direction,searchOrder)
    405c405
    < data.speed=math.abs(vel[1])
    ---
    > self.speed=math.abs(vel[1])
    408c408
    < data.speed= (math.abs(vel[1]) + vel[2] * grad) / math.sqrt(2)
    ---
    > self.speed= (math.abs(vel[1]) + vel[2] * grad) / math.sqrt(2)
    410c410
    < if data.speed < 0 then
    ---
    > if self.speed < 0 then
    412,414c412,414
    < data.speed = -data.speed
    < data.direction = -data.direction
    < elseif data.speed < 0.001 then
    ---
    > self.speed = -self.speed
    > self.direction = -self.direction
    > elseif self.speed < 0.001 then
    416c416
    < data.direction = 0
    ---
    > self.direction = 0
    421,423c421,423
    < if data.direction == 0 then
    < data.speed = tech.parameter("minSpeed")
    < data.direction = tech.direction()
    ---
    > if self.direction == 0 then
    > self.speed = tech.parameter("minSpeed")
    > self.direction = mcontroller.direction()
    429,430c429,430
    < data.currentRail = nil
    < data.onRail = false
    ---
    > self.currentRail = nil
    > self.onRail = false
    
    tech\superjump\superjump.lua
    2c2
    < data.superJumpTimer = 0
    ---
    > self.superJumpTimer = 0
    6c6
    < if args.moves["jump"] and args.moves["up"] and tech.onGround() then
    ---
    > if args.moves["jump"] and args.moves["up"] and mcontroller.onGround() then
    22c22
    < if args.actions["superjump"] and tech.onGround() and data.superJumpTimer <= 0 and args.availableEnergy > energyUsage then
    ---
    > if args.actions["superjump"] and mcontroller.onGround() and self.superJumpTimer <= 0 and args.availableEnergy > energyUsage then
    24c24
    < data.superJumpTimer = superJumpTime
    ---
    > self.superJumpTimer = superJumpTime
    28,29c28,31
    < if data.superJumpTimer > 0 then
    < tech.yControl(superJumpSpeed, superJumpControlForce)
    ---
    > tech.setFlipped(mcontroller.facingDirection() < 0)
    >
    > if self.superJumpTimer > 0 then
    > mcontroller.controlApproachYVelocity(superJumpSpeed, superJumpControlForce)
    31c33
    < data.superJumpTimer = data.superJumpTimer - args.dt
    ---
    > self.superJumpTimer = self.superJumpTimer - args.dt
    
    tiles\materials\reeds.material
    2c2
    < "materialId" : 112,
    ---
    > "materialId" : 114,
    
    treasure\common.treasurepools
    401c401
    < {"weight" : 0.0015, "item" : [ "generatedsword", 1, { "definition" : "teslastaff" } ]},
    ---
    > {"weight" : 0.0015, "item" : [ "generatedsword", 1, { "definition" : "teslaspear" } ]},
     
  5. Treldent02

    Treldent02 Orbital Explorer

    Ohh..... Epic snowball fights will insue!

    (just one question, will this use energy or snowballs for ammo?)
     
  6. The | Suit

    The | Suit Agent S. Forum Moderator

    Right now there currently is no "ammo" system implemented for guns. So more than likely energy.
     
  7. Darklight

    Darklight Oxygen Tank

    There are regular throwable snowballs too with a giant one that has minimal range
     
  8. Jafetgx

    Jafetgx Phantasmal Quasar

    So are varied status effect on nighlies already, or did you do that manually?

    I've seen they implemented the new stat system for poisoned and healing so far, but haven't found any others, are they ingame yet?

    Also does anyone know how to craft filled bottles? i've got empties but haven't found how to fill them with varied liquids...
     
  9. Dargona1018

    Dargona1018 Existential Complex

    [​IMG]

    That gif loop is tremendous...


    But anyway, this is cool. Glad to see that you guys aren't getting berated for doing work that you are enjoying.
     
    Ehksidian and Higuera like this.
  10. Kawa

    Kawa Tiy's Beard

    I have no words to explain what I am feeling right now.
     
  11. The Observer

    The Observer Phantasmal Quasar

    Wouldn't recommend trying the current nightly. A LOT of items (eg. many food items) have yet to be moved to the new status system and will crash the game if used.
     
  12. Buckycarbon

    Buckycarbon Void-Bound Voyager

    Just gotta point out: I thought the goggles were the character's eyes, and the actual eye pixel was it's mouth, small and concentrating. It looked like a long haired space biker
     
  13. The | Suit

    The | Suit Agent S. Forum Moderator

    That would be a throwable item - not a gun with ammo.
     
  14. Varixai

    Varixai Hard-To-Destroy Reptile

    Snowball machine gun complete with accompanying perfectly looped gif?

    obligatory shut-up-and-take-my-money.jpg

    If you guys ever had competitors, you have long since left them in the star dust. Bravo.
     
  15. Akado

    Akado Oxygen Tank

    Does anyone else wonder why that banjo doesn't have strings?
     
    Kawa and Dargona1018 like this.
  16. Yamada Stone

    Yamada Stone Void-Bound Voyager

    Wow! Cool stuff.
     
  17. Milan Mree

    Milan Mree Ketchup Robot

    And then he gets hit and killed instantly. R.I.P. snowball cannon.
     
  18. Bloxxor

    Bloxxor Void-Bound Voyager

    My Game keeps crashing when I try to eat cooked meat. :(
     
  19. Dargona1018

    Dargona1018 Existential Complex

     
  20. JacobGrey

    JacobGrey Void-Bound Voyager

    I really like this idea. A lot.
     

Share This Page