FILES ----- [NEW] animations\elementalaura\iceaura\iceaura.animation [NEW] animations\elementalaura\iceaura\iceaura.frames [NEW] animations\elementalaura\iceaura\iceaura.png [NEW] animations\elementalaura\poisonaura\poisonaura.animation [NEW] animations\elementalaura\poisonaura\poisonaura.frames [NEW] animations\elementalaura\poisonaura\poisonaura.png biomes\underground\underground1b.biome damage\falling.damage [NEW] damage\fist.damage dungeons\microdungeons\underground\underground1a\underground1amicrodungeons.dungeon [NEW] dungeons\microdungeons\underground\underground1a\underground1a_tunnelweakbackslope2.json [NEW] dungeons\microdungeons\underground\underground1a\underground1a_tunnelweakforwardslope2.json [NEW] dungeons\microdungeons\underground\underground1b\underground1bmicrodungeons.dungeon [NEW] dungeons\microdungeons\underground\underground1b\underground1b_open1.json [NEW] dungeons\microdungeons\underground\underground1b\underground1b_tunnel1.json [NEW] dungeons\microdungeons\underground\underground1b\underground1b_tunnelbackslope1.json [NEW] dungeons\microdungeons\underground\underground1b\underground1b_tunnelforwardslope1.json [NEW] dungeons\microdungeons\underground\underground1b\underground1b_tunnelweakbackslope1.json [NEW] dungeons\microdungeons\underground\underground1b\underground1b_tunnelweakforwardslope1.json interface\quests\questlog\body.png interface\quests\questlog\details - copy.png interface\quests\questlog\details.png interface\quests\questlog\entry_bg.png interface\quests\questlog\entry_selected.png interface\quests\questlog\footer.png interface\quests\questlog\header.png interface\quests\questlog\shine.png interface\tooltips\tool.tooltip interface\windowconfig\newquest.config interface\windowconfig\questlog.config items\active\shields\shield.lua items\active\weapons\fist\fistweapon.animation items\active\weapons\fist\fistweapon.lua items\active\weapons\fist\punch.lua items\active\weapons\fist\testfist.activeitem [NEW] items\active\weapons\fist\swoosh\physicalswooshbig.png items\active\weapons\melee\altabilities\broadsword\parry\parry.lua items\active\weapons\melee\altabilities\hammer\elementalaura\elementalaura.altability items\active\weapons\melee\altabilities\hammer\shockwave\physicalshockwave.altability items\active\weapons\melee\altabilities\spear\rocketspear\rocketspear.lua items\active\weapons\ranged\altabilities\burstshot\burstshot.altability items\active\weapons\ranged\altabilities\deathbomb\deathbomb.altability items\active\weapons\ranged\altabilities\explosiveburst\explosiveburst.altability items\active\weapons\ranged\altabilities\lance\lance.altability items\buildscripts\buildshield.lua items\buildscripts\buildweapon.lua [NEW] monsters\walkers\bulbop\body.monsterpart [NEW] monsters\walkers\bulbop\bulbop.animation [NEW] monsters\walkers\bulbop\bulbop.frames [NEW] monsters\walkers\bulbop\bulbop.monstertype [NEW] monsters\walkers\bulbop\bulbop.png monsters\walkers\capricoat\capricoat.monstertype [NEW] monsters\walkers\fennix\body.monsterpart [NEW] monsters\walkers\fennix\fennix.animation [NEW] monsters\walkers\fennix\fennix.frames [NEW] monsters\walkers\fennix\fennix.monstertype [NEW] monsters\walkers\fennix\fennix.png [NEW] monsters\walkers\lilodon\body.monsterpart [NEW] monsters\walkers\lilodon\lilodon.animation [NEW] monsters\walkers\lilodon\lilodon.frames [NEW] monsters\walkers\lilodon\lilodon.monstertype [NEW] monsters\walkers\lilodon\lilodon.png [NEW] monsters\walkers\orbide\body.monsterpart [NEW] monsters\walkers\orbide\orbide.animation [NEW] monsters\walkers\orbide\orbide.frames [NEW] monsters\walkers\orbide\orbide.monstertype [NEW] monsters\walkers\orbide\orbide.png monsters\walkers\pipkin\pipkin.monstertype [NEW] monsters\walkers\poptop\body.monsterpart [NEW] monsters\walkers\poptop\poptop.animation [NEW] monsters\walkers\poptop\poptop.frames [NEW] monsters\walkers\poptop\poptop.monstertype [NEW] monsters\walkers\poptop\poptop.png monsters\walkers\ringram\ringram.monstertype npcs\base.npctype npcs\guard.npctype npcs\villageguard.npctype npcs\biome\shadowvillager.npctype npcs\subbiometenants\bones.npctype npcs\tenants\apexresearchlab.npctype npcs\tenants\creepling.npctype npcs\tenants\friendlycultist.npctype npcs\tenants\hazmat.npctype npcs\tenants\humanprison.npctype particles\iceswoosh1.particle particles\iceswoosh2.particle particles\poisonswoosh1.particle particles\poisonswoosh2.particle [NEW] particles\elementalaura\iceaura\iceaura.particle [NEW] particles\elementalaura\poisonaura\poisonaura.particle projectiles\explosions\burstexplosion\electricburstexplosion.png projectiles\explosions\burstexplosion\fireburstexplosionfreeze.config projectiles\explosions\burstexplosion\fireburstexplosionfreeze.projectile projectiles\explosions\burstexplosion\iceburstexplosionfreeze.config projectiles\explosions\burstexplosion\iceburstexplosionfreeze.projectile projectiles\explosions\burstexplosion\poisonburstexplosionfreeze.config projectiles\explosions\burstexplosion\poisonburstexplosionfreeze.projectile projectiles\guidedrocket\electricguidedrocket.projectile projectiles\guidedrocket\fireguidedrocket.projectile projectiles\guidedrocket\iceguidedrocket.projectile projectiles\guidedrocket\poisonguidedrocket.projectile projectiles\guns\unsorted\deathbombdart\deathbombdart.projectile projectiles\guns\unsorted\deathbombdart\deathbombdartelectric.projectile projectiles\guns\unsorted\deathbombdart\deathbombdartfire.projectile projectiles\guns\unsorted\deathbombdart\deathbombdartice.projectile projectiles\guns\unsorted\deathbombdart\deathbombdartpoison.projectile projectiles\weather\ash\ash.projectile projectiles\weather\sandstorm\sandstorm.projectile projectiles\weather\settlingsnow\settlingsnow.projectile projectiles\weather\water\lightwater.projectile projectiles\weather\water\water.projectile [NEW] projectiles\weather\water\waterstatus.projectile quests\generated\comfort.config quests\generated\control.config [NEW] quests\generated\guard.config [NEW] quests\generated\normal.config quests\generated\protection.config [NEW] quests\generated\shady.config [NEW] quests\generated\subquests\add_object_to_house.questtemplate quests\generated\subquests\bribe.questtemplate quests\generated\subquests\build_home.questtemplate quests\generated\subquests\collect_fine.questtemplate quests\generated\subquests\collect_for_safekeeping.questtemplate quests\generated\subquests\collect_gift.questtemplate quests\generated\subquests\cooking.questtemplate quests\generated\subquests\craft.questtemplate quests\generated\subquests\extort.questtemplate quests\generated\subquests\farming.questtemplate quests\generated\subquests\fetch.questtemplate quests\generated\subquests\fetch_dungeon.questtemplate quests\generated\subquests\gift.questtemplate quests\generated\subquests\intimidate.questtemplate quests\generated\subquests\kill_monster.questtemplate quests\generated\subquests\protect.questtemplate quests\generated\subquests\request_craft.questtemplate quests\generated\subquests\return_stolen.questtemplate quests\generated\subquests\share_secret.questtemplate quests\generated\subquests\spread_rumors.questtemplate quests\generated\subquests\steal.questtemplate scripts\status.lua scripts\actions\quests.lua scripts\quest\participant.lua scripts\questgen\generator.lua scripts\questgen\relations.lua [NEW] sfx\gun\burstshot1.ogg [NEW] sfx\gun\elemental_lance.ogg sfx\melee\shockwave_physical_charge.ogg [NEW] sfx\projectiles\guidedrocket_electric_loop.ogg [NEW] sfx\projectiles\guidedrocket_fire_loop.ogg [NEW] sfx\projectiles\guidedrocket_ice_loop.ogg [NEW] sfx\projectiles\guidedrocket_poison_loop.ogg [NEW] sfx\projectiles\plasma3.ogg stats\effects\deathbomb\deathbomb.lua stats\effects\deathbomb\deathbombelectric.statuseffect stats\effects\deathbomb\deathbombfire.statuseffect stats\effects\deathbomb\deathbombice.statuseffect stats\effects\deathbomb\deathbombpoison.statuseffect stats\effects\elementalaura\iceaura.animation stats\effects\elementalaura\iceaura.png stats\effects\elementalaura\poisonaura.animation stats\effects\elementalaura\poisonaura.png tenants\other\hazmat.tenant [NEW] treasure\questrewards.treasurepools vehicles\hoverbike\hoverbike.animation vehicles\hoverbike\hoverbike.lua vehicles\hoverbike\hoverbike.vehicle weather\ash\ash.weather weather\fog\fog.weather weather\rain\rain.weather weather\rain\storm.weather DIFFS ----- biomes\underground\underground1b.biome 159c159 < "distribution" : "/biomes/distributions.config:randomEncounterUnderground", --- > "distribution" : "/biomes/distributions.config:denseSmall", 162c162 < "microdungeons" : [ "undergroundmicrodungeons" ] --- > "microdungeons" : [ "underground1bmicrodungeons" ] damage\falling.damage 22c22 < "sounds" : [ "/sfx/melee/shield_block_metal2.ogg" ], --- > "sounds" : [ "/sfx/melee/shield_block_metal.ogg" ], dungeons\microdungeons\underground\underground1a\underground1amicrodungeons.dungeon 8c8 < "anchor" : [ "underground1a_open1", "underground1a_tunnelBackSlope1", "underground1a_tunnelForwardSlope1", "underground1a_tunnel1", "underground1a_tunnelWeakBackSlope1", "underground1a_tunnelWeakForwardSlope1" ], --- > "anchor" : [ "underground1a_open1", "underground1a_open2", "underground1a_tunnelBackSlope1", "underground1a_tunnelBackSlope2", "underground1a_tunnelForwardSlope1", "underground1a_tunnelForwardSlope2", "underground1a_tunnel1", "underground1a_tunnel2", "underground1a_tunnelWeakBackSlope1", "underground1a_tunnelWeakBackSlope2", "underground1a_tunnelWeakForwardSlope1", "underground1a_tunnelWeakForwardSlope2" ], 24a25,31 > "name" : "underground1a_open2", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "underground1a_open2.json" ] > }, > { 31a39,45 > "name" : "underground1a_tunnelBackSlope2", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "underground1a_tunnelBackSlope2.json" ] > }, > { 38a53,59 > "name" : "underground1a_tunnelForwardSlope2", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "underground1a_tunnelForwardSlope2.json" ] > }, > { 45a67,73 > "name" : "underground1a_tunnel2", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "underground1a_tunnel2.json" ] > }, > { 52a81,87 > "name" : "underground1a_tunnelWeakBackSlope2", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "underground1a_tunnelWeakBackSlope2.json" ] > }, > { 57a93,99 > }, > { > "name" : "underground1a_tunnelWeakForwardSlope2", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "underground1a_tunnelWeakForwardSlope2.json" ] interface\tooltips\tool.tooltip 13c13 < "moneyInfo" : { --- > "priceLabel" : { interface\windowconfig\newquest.config 70,71c70 < //"position" : [216, 47], < "position" : [120, 55], --- > "position" : [216, 47], 83,84c82 < //"position" : [216, 47], < "position" : [120, 55], --- > "position" : [216, 47], 90,92c88,89 < //"position" : [220, 57], < "position" : [124, 65], < "scale" : 1.5 --- > "position" : [220, 57], > "scale" : 1.5, 96,97c93 < //"position" : [235, 49], < "position" : [139, 57], --- > "position" : [235, 49], interface\windowconfig\questlog.config 17c17 < "position" : [262, 272] --- > "position" : [310, 259] 34c34 < "position" : [0, 0], --- > "position" : [1, 9], 46c46 < "position" : [159, 48], --- > "position" : [176, 22], 53c53 < "position" : [228, 48], --- > "position" : [258, 22], 58,59c58,59 < "position" : [169, 66], < "dimensions" : [5, 1], --- > "position" : [207, 44], > "dimensions" : [2, 1], 66c66 < "position" : [180, 88], --- > "position" : [166, 48], 70,82c70 < }, < "labelPortraitTitle" : { < "type" : "label", < "position" : [180, 98], < "fontSize" : 8, < "color" : "green" < }, < "imagePortrait" : { < "type" : "image", < "position" : [160, 88], < "scale" : 1.0, < "offset" : [20, 10] < }, --- > }, 86c74 < "position" : [218, 88] --- > "position" : [800, 88] 88c76 < "labelMoneyAmount" : { --- > "labelMoneyAmount" : { 90c78 < "position" : [230, 87], --- > "position" : [800, 87], 93a82,115 > }, > "imgPolaroid" : { > "type" : "image", > "file" : "/interface/quests/newquest/polaroid.png", > "position" : [260, 45], > "zlevel" : -1 > }, > "imagePortrait" : { > "type" : "image", > "position" : [264, 55], > "scale" : 1.5, > "offset" : [35, 10] > }, > "labelPortraitTitle" : { > "type" : "label", > "position" : [265, 46], > "fontSize" : 8, > "color" : "black" > }, > "imgPolaroidBack" : { > "type" : "image", > "file" : "/interface/quests/newquest/polaroidBackground.png", > "position" : [260, 45], > "zlevel" : -2 > }, > /* > "objectivePortraitTitle" : { > "type" : "label", > "position" : [235, 49], > "hAnchor" : "mid", > "fontSize" : 4, > "charLimit" : 12, > "value" : "", > "color" : "black" 94a117 > */ 97c120 < "position" : [217, 243], --- > "position" : [240, 244], 107c130 < "position" : [163, 232], --- > "position" : [166, 232], 110c133 < "wrapWidth" : 109, --- > "wrapWidth" : 150, 117c140 < "rect" : [5, 44, 156, 244], --- > "rect" : [5, 32, 156, 232], 140c163 < "position" : [70, 11], --- > "position" : [80, 9], 152c175 < "position" : [120, 0] --- > "position" : [0, 0] 164c187 < "position" : [3, 250], --- > "position" : [3, 238], 172c195 < "position" : [58, 250], --- > "position" : [58, 238], 179c202 < "position" : [105, 250], --- > "position" : [105, 238], items\active\shields\shield.lua 89c89 < self.damageListener = damageListener("damageTakenSince", function(notifications) --- > self.damageListener = damageListener("damageTaken", function(notifications) items\active\weapons\fist\fistweapon.animation 12a13,18 > }, > "special" : { > "frames" : 3, > "cycle" : 0.2, > "mode" : "transition", > "transition" : "idle" 42a49,70 > }, > "special" : { } > } > } > }, > "specialswoosh" : { > "properties" : { > "transformationGroups" : ["weapon"], > "centered" : true, > "offset" : [0.5, 0.125], > "zLevel" : 1 > }, > > "partStates" : { > "attack" : { > "idle" : { }, > "fire" : { }, > "special" : { > "properties" : { > "image" : ":", > "damageArea" : [[-1, -1.4], [1.25, -0.9], [1.25, 1.1], [-1, 1.6]] > } 55c83,84 < "fire" : [ ] --- > "fire" : [ ], > "special" : [ ] items\active\weapons\fist\fistweapon.lua 2a3 > require "/scripts/status.lua" 28a30,31 > > activeItem.callOtherHandScript("fistBump", nil) items\active\weapons\fist\punch.lua 16a17,20 > > self.weapon.comboStep = 1 > self.weapon.comboTimer = 0 > self.weapon.comboTimeout = self.comboTimeout 23a28,32 > self.weapon.comboTimer = math.max(0, self.weapon.comboTimer - self.dt) > if self.weapon.comboTimer == 0 and self.weapon.comboStep > 1 then > -- sb.logInfo("Combo with %s fist timed out", activeItem.hand()) > self.weapon.comboStep = 1 > end 53c62,66 < self:setState(self.fire) --- > if self.weapon.comboStep == self.comboSteps then > self:setState(self.special) > else > self:setState(self.fire) > end 65a79,94 > self.damageConfig.knockback = self.knockback[self.weapon.comboStep] > > -- sb.logInfo("Attacking with %s fist on combo step %s", activeItem.hand(), self.weapon.comboStep) > > local comboStep = self.weapon.comboStep > local hitListener = damageListener("inflictedHits", function(notifications) > -- sb.logInfo("Received notifications: %s", notifications) > for _,notification in pairs(notifications) do > if notification.damageSourceKind == "fist" then > -- sb.logInfo("Hit with %s fist, setting other fist combo to %s", activeItem.hand(), comboStep + 1) > activeItem.callOtherHandScript("fistBump", comboStep + 1) > break > end > end > end) > 67a97 > 70d99 < 76a106,107 > > hitListener:update() 81a113,143 > -- State: special > function Punch:special() > self.weapon:setStance(self.stances.special) > self.weapon:updateAim() > > animator.setAnimationState("attack", "special") > animator.playSound("special") > > status.addEphemeralEffect("invulnerable", self.stances.special.duration) > > self.damageConfig.knockback = self.knockback[self.weapon.comboStep] > > -- sb.logInfo("Finishing combo with %s fist", activeItem.hand()) > > util.wait(self.stances.special.duration, function() > local damageArea = partDamageArea("specialswoosh") > > self.weapon:setDamage(self.damageConfig, damageArea, self.fireTime) > > if self.movePlayer and not mcontroller.crouching() then > if math.abs(mcontroller.xVelocity()) < self.stances.special.xVelocity then > mcontroller.setXVelocity(self.stances.special.xVelocity * self.weapon.aimDirection) > mcontroller.controlMove(self.weapon.aimDirection, false) > end > end > end) > > self.weapon.comboStep = 1 > self.cooldownTimer = self:cooldownTime() > end > 87a150,161 > end > > -- receive combo notification from other fist > function fistBump(comboStep) > if comboStep then > -- sb.logInfo("%s fist received message setting comboStep to %s", activeItem.hand(), comboStep) > self.weapon.comboStep = comboStep > self.weapon.comboTimer = self.weapon.comboTimeout > else > sb.logInfo("%s received invalid notification with comboStep %s", activeItem.hand(), comboStep) > end > return true items\active\weapons\fist\testfist.activeitem 17c17,18 < "swoosh" : "swoosh/physicalswoosh.png" --- > "swoosh" : "swoosh/physicalswoosh.png", > "specialswoosh" : "swoosh/physicalswooshbig.png" 21c22,23 < "fire" : [ "/sfx/melee/swing_dagger.ogg" ] --- > "fire" : [ "/sfx/melee/swing_dagger.ogg" ], > "special" : [ "/sfx/melee/swing_broadsword.ogg" ] 31c33 < "damageSourceKind" : "dagger", --- > "damageSourceKind" : "fist", 33d34 < "knockback" : 20, 35c36,39 < } --- > }, > "knockback" : [10, 10, 30], > "comboSteps" : 3, > "comboTimeout" : 1.0 92c96,111 < "xVelocity" : 15 --- > "xVelocity" : 5 > }, > "special" : { > "duration" : 0.2, > "armRotation" : 0, > "weaponRotation" : 0, > "weaponRotationCenter" : [-1.0, 0.0], > "weaponOffset" : [0.125, -0.25], > > "allowRotate" : false, > "allowFlip" : false, > > "frontArmFrame" : "rotation", > "backArmFrame" : "rotation", > > "xVelocity" : 10 items\active\weapons\melee\altabilities\broadsword\parry\parry.lua 37c37 < local damageListener = damageListener("damageTakenSince", function(notifications) --- > local damageListener = damageListener("damageTaken", function(notifications) items\active\weapons\melee\altabilities\hammer\elementalaura\elementalaura.altability 55c55,56 < { "particle" : "iceswoosh3"} --- > { "particle" : "iceswoosh3"}, > { "particle" : "iceaura"} items\active\weapons\melee\altabilities\hammer\shockwave\physicalshockwave.altability 12c12 < "physicalcharge" : [ "/sfx/melee/shockwave_physical_charge.ogg" ], --- > "physicalcharge" : [ ], items\active\weapons\melee\altabilities\spear\rocketspear\rocketspear.lua 52c52 < mcontroller.controlApproachVelocityAlongAngle(boostAngle, self.boostSpeed, self.boostForce) --- > mcontroller.controlApproachVelocityAlongAngle(boostAngle, self.boostSpeed, self.boostForce, true) items\active\weapons\ranged\altabilities\burstshot\burstshot.altability 53c53 < "burstshot" : [ "/sfx/gun/rocket2.ogg" ] --- > "burstshot" : [ "/sfx/gun/burstshot1.ogg" ] items\active\weapons\ranged\altabilities\deathbomb\deathbomb.altability 4c4 < "altFire" : [ "/sfx/gun/blowgun1.ogg", "/sfx/gun/blowgun2.ogg", "/sfx/gun/blowgun3.ogg" ] --- > "altFire" : [ "/sfx/gun/needler1.ogg" ] items\active\weapons\ranged\altabilities\explosiveburst\explosiveburst.altability 46c46 < "burstTime" : 0.04, --- > "burstTime" : 0.05, items\active\weapons\ranged\altabilities\lance\lance.altability 125,128c125,128 < "firelancefire" : [ "/sfx/gun/plasma_sniper4.ogg" ], < "electriclancefire" : [ "/sfx/gun/plasma_sniper4.ogg" ], < "icelancefire" : [ "/sfx/gun/plasma_sniper4.ogg" ], < "poisonlancefire" : [ "/sfx/gun/plasma_sniper4.ogg" ] --- > "firelancefire" : [ "/sfx/gun/elemental_lance.ogg" ], > "electriclancefire" : [ "/sfx/gun/elemental_lance.ogg" ], > "icelancefire" : [ "/sfx/gun/elemental_lance.ogg" ], > "poisonlancefire" : [ "/sfx/gun/elemental_lance.ogg" ] items\buildscripts\buildshield.lua 3c3,7 < function build(directory, config, parameters) --- > function build(directory, config, parameters, level) > if level then > parameters.level = level > end > items\buildscripts\buildweapon.lua 5c5,9 < function build(directory, config, parameters) --- > function build(directory, config, parameters, level) > if level then > parameters.level = level > end > 66a71 > -- TODO: store less data monsters\walkers\capricoat\capricoat.monstertype 80c80 < "poly" : [ [0.8125, 1.25], [1.3125, 0.75], [1.3125, -0.85], [0.8125, -1.35], [-0.8125, -1.35], [-1.3125, -0.85], [-1.3125, 0.75], [-0.8125, 1.25] ], --- > "poly" : [ [0.8125, 1.25], [1.3125, 0.75], [1.3125, -1.05], [0.8125, -1.55], [-0.8125, -1.55], [-1.3125, -1.05], [-1.3125, 0.75], [-0.8125, 1.25] ], 89c89 < "metaBoundBox" : [-0.5, -0.5, 0.5, 0.5], --- > "metaBoundBox" : [-2.0, -2.0, 2.0, 2.0], 93c93 < "collisionPoly" : [ [0.8125, 1.25], [1.3125, 0.75], [1.3125, -0.85], [0.8125, -1.35], [-0.8125, -1.35], [-1.3125, -0.85], [-1.3125, 0.75], [-0.8125, 1.25] ], --- > "collisionPoly" : [ [0.8125, 1.25], [1.3125, 0.75], [1.3125, -1.05], [0.8125, -1.55], [-0.8125, -1.55], [-1.3125, -1.05], [-1.3125, 0.75], [-0.8125, 1.25] ], monsters\walkers\pipkin\pipkin.monstertype 85c85 < "poly" : [ [0.3125, 1.25], [0.8125, 0.75], [0.8125, -0.75], [0.3125, -1.25], [-0.3125, -1.25], [-0.8125, -0.75], [-0.8125, 0.75], [-0.3125, 1.25] ], --- > "poly" : [ [0.3125, 1.25], [0.8125, 0.75], [0.8125, -1.0], [0.3125, -1.5], [-0.3125, -1.5], [-0.8125, -1.0], [-0.8125, 0.75], [-0.3125, 1.25] ], 98c98 < "collisionPoly" : [ [0.3125, 1.25], [0.8125, 0.75], [0.8125, -0.75], [0.3125, -1.25], [-0.3125, -1.25], [-0.8125, -0.75], [-0.8125, 0.75], [-0.3125, 1.25] ], --- > "collisionPoly" : [ [0.3125, 1.25], [0.8125, 0.75], [0.8125, -1.0], [0.3125, -1.5], [-0.3125, -1.5], [-0.8125, -1.0], [-0.8125, 0.75], [-0.3125, 1.25] ], monsters\walkers\ringram\ringram.monstertype 93c93 < "collisionPoly" : [ [0.3125, 1.25], [0.8125, 0.75], [0.8125, -0.55], [0.3125, -0.95], [-0.3125, -0.95], [-0.8125, -0.55], [-0.8125, 0.75], [-0.3125, 1.25] ], --- > "collisionPoly" : [ [0.3125, 1.25], [0.8125, 0.75], [0.8125, -0.35], [0.3125, -0.75], [-0.3125, -0.75], [-0.8125, -0.35], [-0.8125, 0.75], [-0.3125, 1.25] ], npcs\base.npctype 23c23 < "drives" : ["comfort", "protection", "control"], --- > "pools" : ["normal"], npcs\guard.npctype 10a11 > "pools" : ["normal", "guard"], npcs\villageguard.npctype 12a13 > "pools" : ["normal", "guard"], npcs\biome\shadowvillager.npctype 11a12 > "pools" : ["normal", "shady"], npcs\subbiometenants\bones.npctype 32a33,36 > "questGenerator" : { > "pools" : ["normal", "shady"] > }, > npcs\tenants\apexresearchlab.npctype 25a26,29 > }, > > "questGenerator" : { > "pools" : ["normal", "shady"] 46c50 < } \ No newline at end of file --- > } npcs\tenants\creepling.npctype 16a17,20 > }, > > "questGenerator" : { > "pools" : ["normal", "shady"] 37c41 < } \ No newline at end of file --- > } npcs\tenants\friendlycultist.npctype 51a52,55 > }, > > "questGenerator" : { > "pools" : ["normal", "shady"] 72c76 < } \ No newline at end of file --- > } npcs\tenants\hazmat.npctype 12c12 < "I've seen the kind of diseases that the Miniknog research. It's nasty stuff.", --- > "I've seen the kind of diseases that the MiniKnog researches. Nasty stuff.", npcs\tenants\humanprison.npctype 25a26,28 > }, > "questGenerator" : { > "pools" : ["normal", "shady"] 43c46 < } \ No newline at end of file --- > } particles\iceswoosh1.particle 12d11 < "fade" : 1, 15a15,16 > "fade" : 0.5, > "light" : [0, 60, 80], particles\iceswoosh2.particle 11d10 < "fade" : 1, 14a14,15 > "fade" : 0.5, > "light" : [0, 60, 80], particles\poisonswoosh1.particle 10a11,12 > "fade" : 0.5, > "light" : [50, 90, 0], particles\poisonswoosh2.particle 10d9 < "fade" : 0.5, 14a14,15 > "fade" : 0.5, > "light" : [50, 90, 0], projectiles\explosions\burstexplosion\fireburstexplosionfreeze.config 49,51c49,122 < "animation" : "/animations/ember1/ember1.animation", < "approach" : [0.5, 0.5], < "timeToLive" : 0.6, --- > "looping" : true, > "animation" : "/animations/statuseffects/burning/burning.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [50, 50], > "destructionAction" : "shrink", > "destructionTime" : 0.425, > "fade" : 1, > "light" : [191, 103, 2], > "size" : 0.5, > "layer" : "middle", > "timeToLive" : 0.6, > "variance" : { > "finalVelocity" : [3, 3], > "position" : [2, 2] > } > } > } > ] > } > ] > }, > { > "action" : "loop", > "count" : 7, > "body" : [ > { > "action" : "option", > "options" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/dust2/dust2.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [50, 50], > "destructionAction" : "shrink", > "destructionTime" : 0.5, > "fade" : 1, > "size" : 1, > "layer" : "back", > "timeToLive" : 0.6, > "variance" : { > "finalVelocity" : [4, 4], > "position" : [2, 2] > } > } > } > ] > } > ] > }, > { > "action" : "loop", > "count" : 7, > "body" : [ > { > "action" : "option", > "options" : [ > { > "action" : "particle", > "specification" : { > "type" : "ember", > "size" : 1.0, > "color" : [253, 143, 77, 255], > "position" : [0, 0], > "fade" : 0.9, > "initialVelocity" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [20, 20], > "light" : [191, 103, 2], > "destructionTime" : 0.8, > "layer" : "back", 53,56c124,126 < "position" : [1.5, 1.5], < "initialVelocity" : [6, 6], < "timeToLive" : 0.5, < "rotation" : 180 --- > "finalVelocity" : [5, 5], > "position" : [2, 2], > "size" : 0.5 projectiles\explosions\burstexplosion\fireburstexplosionfreeze.projectile 3c3 < "frames" : "fireburstexplosion.png", --- > "frames" : "electricburstexplosion.png", projectiles\explosions\burstexplosion\iceburstexplosionfreeze.config 48a49 > "looping" : true, 50,51c51,59 < "approach" : [0.5, 0.5], < "timeToLive" : 0.5, --- > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [50, 50], > "destructionAction" : "shrink", > "destructionTime" : 0.6, > "fade" : 1, > "size" : 0.5, > "layer" : "middle", > "timeToLive" : 0.6, 53,56c61,62 < "timeToLive" : 0.15, < "position" : [2, 2], < "initialVelocity" : [1, 1], < "rotation" : 180 --- > "finalVelocity" : [1.5, 1.5], > "position" : [2, 2] 79,80c85,93 < "approach" : [0.5, 0.5], < "timeToLive" : 2.0, --- > "finalVelocity" : [0, 0], > "approach" : [50, 50], > "position" : [0, 0], > "destructionAction" : "shrink", > "destructionTime" : 0.6, > "fade" : 1, > "size" : 1, > "layer" : "back", > "timeToLive" : 0.6, 82,85c95,127 < "timeToLive" : 0.4, < "position" : [2, 2], < "initialVelocity" : [1, 1], < "rotation" : 180 --- > "finalVelocity" : [1.5, 1.5], > "position" : [2, 2] > } > } > } > ] > } > ] > }, > { > "action" : "loop", > "count" : 7, > "body" : [ > { > "action" : "option", > "options" : [ > { > "action" : "particle", > "specification" : { > "type" : "ember", > "size" : 1.0, > "color" : [99, 216, 232, 255], > "fade" : 0.9, > "initialVelocity" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [20, 20], > "position" : [0, 0], > "destructionTime" : 0.8, > "layer" : "back", > "variance" : { > "finalVelocity" : [1.5, 1.5], > "position" : [2, 2], > "size" : 0.5 projectiles\explosions\burstexplosion\iceburstexplosionfreeze.projectile 3c3 < "frames" : "iceburstexplosion.png", --- > "frames" : "electricburstexplosion.png", projectiles\explosions\burstexplosion\poisonburstexplosionfreeze.config 94a95,120 > "action" : "loop", > "count" : 7, > "body" : [ > { > "action" : "option", > "options" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/statuseffects/poison/poisonshort.animation", > "approach" : [0.5, 0.5], > "timeToLive" : 4, > "variance" : { > "timeToLive" : 0.15, > "position" : [2.5, 2.5], > "initialVelocity" : [8, 8], > "rotation" : 180 > } > } > } > ] > } > ] > }, > { projectiles\explosions\burstexplosion\poisonburstexplosionfreeze.projectile 3c3 < "frames" : "poisonburstexplosion.png", --- > "frames" : "electricburstexplosion.png", projectiles\guidedrocket\electricguidedrocket.projectile 32c32,34 < "trailDistance" : 2.0 --- > "trailDistance" : 2.0, > > "persistentAudio" : "/sfx/projectiles/guidedrocket_electric_loop.ogg" projectiles\guidedrocket\fireguidedrocket.projectile 32c32,34 < "trailDistance" : 2.0 --- > "trailDistance" : 2.0, > > "persistentAudio" : "/sfx/projectiles/guidedrocket_fire_loop.ogg" projectiles\guidedrocket\iceguidedrocket.projectile 32c32,34 < "trailDistance" : 2.0 --- > "trailDistance" : 2.0, > > "persistentAudio" : "/sfx/projectiles/guidedrocket_ice_loop.ogg" projectiles\guidedrocket\poisonguidedrocket.projectile 32c32,34 < "trailDistance" : 2.0 --- > "trailDistance" : 2.0, > > "persistentAudio" : "/sfx/projectiles/guidedrocket_poison_loop.ogg" projectiles\guns\unsorted\deathbombdart\deathbombdart.projectile 5c5 < "physics" : "laser", --- > "physics" : "arrow", 8c8 < "speed" : 140, --- > "speed" : 125, 16c16 < "damageKind" : "default", --- > "damageKind" : "dagger", projectiles\guns\unsorted\deathbombdart\deathbombdartelectric.projectile 5c5 < "physics" : "laser", --- > "physics" : "arrow", 8c8 < "speed" : 140, --- > "speed" : 125, 16c16 < "damageKind" : "default", --- > "damageKind" : "electricdagger", projectiles\guns\unsorted\deathbombdart\deathbombdartfire.projectile 5c5 < "physics" : "laser", --- > "physics" : "arrow", 8c8 < "speed" : 140, --- > "speed" : 125, 16c16 < "damageKind" : "default", --- > "damageKind" : "firedagger", projectiles\guns\unsorted\deathbombdart\deathbombdartice.projectile 5c5 < "physics" : "laser", --- > "physics" : "arrow", 8c8 < "speed" : 140, --- > "speed" : 125, 16c16 < "damageKind" : "default", --- > "damageKind" : "icedagger", projectiles\guns\unsorted\deathbombdart\deathbombdartpoison.projectile 5c5 < "physics" : "laser", --- > "physics" : "arrow", 8c8 < "speed" : 140, --- > "speed" : 125, 16c16 < "damageKind" : "default", --- > "damageKind" : "poisondagger", projectiles\weather\ash\ash.projectile 10,19c10,11 < < "action" : "option", < "options" : [ < { < "action" : "tile", < "materials" : [ { "quantity" : 1, "kind" : "ash" } ] < } < ] < < --- > "action" : "tile", > "materials" : [ { "quantity" : 1, "kind" : "ash" } ] 21d12 < 25c16,20 < "damageKind" : "default" --- > "damageKind" : "default", > > "onlyHitTerrain" : true, > "hydrophobic" : false, > "masterOnly" : true projectiles\weather\sandstorm\sandstorm.projectile 18,19c18,20 < "onlyHitTerrain" : false, < "hydrophobic" : false --- > "onlyHitTerrain" : true, > "hydrophobic" : false, > "masterOnly" : true projectiles\weather\settlingsnow\settlingsnow.projectile 20,21c20,22 < "onlyHitTerrain" : false, < "hydrophobic" : true --- > "onlyHitTerrain" : true, > "hydrophobic" : true, > "masterOnly" : true projectiles\weather\water\lightwater.projectile 13,14d12 < //"previousMod" : "metamod:none", < // "previousMod" : null, 19c17,18 < "onlyHitTerrain" : false, --- > > "onlyHitTerrain" : true, 21,23c20 < "statusEffects" : [ < "soaked" < ] --- > "masterOnly" : true projectiles\weather\water\water.projectile 18,19d17 < //"previousMod" : "metamod:none", < // "previousMod" : null, 25,29c23 < "statusEffects" : [ < "soaked" < ], < < "onlyHitTerrain" : false, --- > "onlyHitTerrain" : true, quests\generated\comfort.config 1,40d0 < { < "add_object_to_house" : { < "templateId" : "add_object_to_house.generated", < "participants" : { < "deed" : { "critical" : true } < }, < < "preconditions" : [ < ["itemList", "extraRewards", "money", "objectPrice"], < ["itemName", "money", {"literal":"money"}], < ["price", "object", "objectPrice"], < < ["owns", "player", "object", "count"], < ["hasTenant", "deed", "questGiver"], < ["owns", "deed", "object", 0], < ["isFurniture", "object"], < [">=", "count", 1], < ["+", "remaining", 1, "count"] < ], < "postconditions" : [ < ["!owns", "player", "object", "count"], < ["owns", "player", "object", "remaining"], < ["!owns", "deed", "object", 0], < ["owns", "deed", "object", 1] < ] < }, < < "likes" : { < "subquestSequence" : true, < "minLength": 2, < "preconditions" : [ < ["!likes", "target", "questGiver"], < ["!=", "target", "questGiver"] < ], < "postconditions" : [ < ["likes", "target", "questGiver"] < ] < } < < } quests\generated\control.config 1,15d0 < { < < "fears" : { < "subquestSequence" : true, < "minLength": 2, < "preconditions" : [ < ["!fears", "target", "questGiver"], < ["!=", "target", "questGiver"] < ], < "postconditions" : [ < ["fears", "target", "questGiver"] < ] < } < < } quests\generated\protection.config 1,79d0 < { < < "collect_fine_furniture" : { < "templateId" : "collect_fine.generated", < "participants" : { < "target" : { < "behaviorOverrides" : [ < { < "type" : "notification", < "behavior" : { "name" : "quest-collect_fine-notification" } < }, < { "type" : "flee", "target" : "player" } < ], < "critical" : true < }, < "questGiver" : { "turnInQuest" : true } < }, < < "chance": 0.5, < < "preconditions" : [ < ["criminal", "target"], < ["owns", "player", "item", 0], < ["!=", "target", "questGiver"], < ["entityExists", "target"], < ["!npcHasFurniture", "target", "item"], < ["isFurniture", "item"] < ], < "postconditions" : [ < ["!criminal", "target"], < ["!likes", "target", "questGiver"], < ["owns", "player", "item", 1] < ] < }, < < "collect_fine_food" : { < "templateId" : "collect_fine.generated", < "participants" : { < "target" : { < "behaviorOverrides" : [ < { < "type" : "notification", < "behavior" : { "name" : "quest-collect_fine-notification" } < }, < { "type" : "flee", "target" : "player" } < ], < "critical" : true < }, < "questGiver" : { "turnInQuest" : true } < }, < < "chance": 0.5, < < "preconditions" : [ < ["criminal", "target"], < ["owns", "player", "item", 0], < ["!=", "target", "questGiver"], < ["entityExists", "target"], < ["isCookedFood", "item"] < ], < "postconditions" : [ < ["!criminal", "target"], < ["!likes", "target", "questGiver"], < ["owns", "player", "item", 1] < ] < }, < < "trusts" : { < "subquestSequence" : true, < "preconditions" : [ < ["!trusts", "target", "questGiver"], < ["!=", "target", "questGiver"] < ], < "postconditions" : [ < ["trusts", "target", "questGiver"] < ] < } < < } quests\generated\subquests\bribe.questtemplate 30c30 < "^cyan;Floran has heard that giving giftsss are great ways to receive favours." --- > "^cyan;Floran wants to owe usss something. Floran has geniusss plan." 37,38c37,38 < "^cyan;The fastest method to win favours is to bribe people, right? I have a plan for ...", < "^cyan;Making friends is easy, but bribery works faster! I want to owe me a favour, so I have a plan." --- > "^cyan;I want to win 's favour, and have a way to make it happen...", > "^cyan;I want to owe me a favour, and now I have a plan." 109c109 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], quests\generated\subquests\build_home.questtemplate 26,27c26,27 < "^cyan;Floran thinks we could do with fresssh blood around here. Let'sss make a new home!", < "^cyan;Floran wantsss more company. Let'sss make a new home!" --- > "^cyan;Floran thinks we could do with fresssh blood around here. Floran hasss a plan!", > "^cyan;Floran wantsss more company. Let's make thisss happen!" 34c34 < "^cyan;I love making friends, could you help me setup a residence for a new neighbour?", --- > "^cyan;I love to make friends. Could you help me setup a residence for a new neighbour?", 50c50 < "The last thing is to ^green;place ^orange^green; inside a house.^white; I'll let you ^green;handle the construction^white; -- I'm not much of a builder. ^green;Remember to place the Colony Deed^white; to announce the unit's available to rent!" --- > "The last thing is to ^green;place ^orange;^green; inside a house.^white; I'll let you ^green;handle the construction ^white;since I'm not much of a builder. ^green;Remember to place the Colony Deed^white; to announce the unit's available to rent!" 77c77 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], quests\generated\subquests\collect_fine.questtemplate 32c32 < "^cyan; has been causing a nuisance around here lately, I've charged them with a fine for criminal damages." --- > "^cyan; has been causing a nuisance around here lately - It's time I set them straight." 146c146 < "You did a good job! Keep the as payment for your services, I just wanted to show that nobody is above the law.", --- > "You did a good job! Keep the as payment for your services. I just wanted to show that nobody is above the law.", 153c153,154 < "I failed to get compensation from for their actions. I guess crime does pay, after all." --- > "I failed to get compensation from for their actions. I guess crime does pay, after all.", > "I failed to collect the fine from . Maybe should chase them up themselves." 158a160 > "rewardParameters" : [ "rewards" ], quests\generated\subquests\collect_for_safekeeping.questtemplate 42c42 < "Now we need to find ourselves one . You should go and ask if we can borrow theirs. No need to mention that we won't be able to return it. ", --- > "Now we need to find ourselves one ^orange;. ^white;You should ^green;go and ask ^orange;^green; if we can borrow theirs. ^white;No need to mention that we won't be able to return it. ", 80a81 > "rewardParameters" : [ "rewards" ], 83,84d83 < < "rewardParameters" : [], quests\generated\subquests\collect_gift.questtemplate 28c28 < "The first thing I'll need is one ^orange;. ^white; has an extra, and owes me a favor. ^green;Could you run over to ^orange;^white; and pick it up?", --- > "The first thing I'll need is one ^orange;.^white; has an extra, and owes me a favor. ^green;Could you run over to ^orange;^white; and pick it up?", 80a81 > "rewardParameters" : [ "rewards" ], 83,84d83 < < "rewardParameters" : [], quests\generated\subquests\cooking.questtemplate 38,39c38,39 < "Now comes the tricky part -- cooking. You should be able to ^green;assemble ^orange;^white; into ^orange;^white;. The recipe seems simple, but my attempts at cooking always taste awful.", < "^orange;^white; aren't going to work alone, so you'll need to do some cooking. You should be able to ^green;whip up ^orange;^white;, why don't you give it a try?" --- > "Now comes the tricky part - cooking. You should be able to ^green;assemble ^orange;^white; into ^orange;^white;. The recipe seems simple, but my attempts at cooking always taste awful.", > "The ^orange;^white; will need some preparing. You should be able to ^green;whip up ^orange;^white;, why don't you give it a try?" 61a62 > "rewardParameters" : [ "rewards" ], quests\generated\subquests\craft.questtemplate 60a61 > "rewardParameters" : [ "rewards" ], quests\generated\subquests\extort.questtemplate 80a81 > "rewardParameters" : [ "rewards" ], 83,84d83 < < "rewardParameters" : [], quests\generated\subquests\farming.questtemplate 34,35c34,35 < "Firstly, I need you to ^green;plant ^orange;. Water them regularly, then when they are ready, ^green;harvest the ^orange; and bring your bountiful harvest to me.", < "First, I need ^orange;,^white; but it's out of season. You can garden right? Here's ^orange;^green; for you to plant,^white; when you've ^green;harvested ^orange;^green; could you bring them to me?" --- > "Firstly, I need you to ^green;plant ^orange;.^white; Water them regularly, then when they are ready, ^green;harvest the ^orange;^green; and bring your bountiful harvest to me.", > "First, I need but it's out of season. You can garden right? Here's ^orange;^green; for you to plant,^white; when you've ^green;harvested ^orange;^green; could you bring them to me?" 64c64 < "Ah, beautifully ripe! You have a real talent for this, .", --- > "Ah, beautifully ripe! You have a real talent for this.", 79c79 < " exactly as requested. Nice work , time to put this produce to good use!" --- > " exactly as requested. Nice work! Time to put this produce to good use!" 86c86 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], quests\generated\subquests\fetch.questtemplate 83c83 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], quests\generated\subquests\fetch_dungeon.questtemplate 49c49 < "Next ^green;we need to search for ^orange;.^white; Once there, ^green;gather up ^orange;^green; and return to me." --- > "Next ^green;we need to search for ^orange;.^white; Once there, ^green;gather up ^orange;^green; and return it to me." 64c64 < "Nice work, I'm sure they've got plenty more in . No one will even notice what you took.", --- > "Nice work, I'm sure they've got plenty of these lying around. No one will even notice what you took.", 78c78 < "Great job ! This is going to work nicely.", --- > "Great job! These are going to work nicely.", 86c86 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], quests\generated\subquests\gift.questtemplate 30c30 < "^cyan;Floran wantss a hunting partner. Floran thinks isss a good choice! Will you help Floran impress them enough to join?" --- > "^cyan;Floran wantss a hunting partner. Floran thinks isss a good choice!" 37,38c37,38 < "^cyan;I'm trying to impress and need the perfect gift. I have one in mind but could use some help. ", < "^cyan;I admire and want to make a good impression. Do you think you could help me get a gift to knock their socks off?" --- > "^cyan;I'm trying to impress my friend. I already have something in mind, but I need your help!", > "^cyan;I want to make a good impression. Please help me do something that will knock 's socks off!" 52,53c52,53 < "I think this is the perfect ^orange. ^green;Could you deliver it to ^orange^white;? Make sure they know it's from me!", < "Who wouldn't love a new ^orange? I hope ^orange^white; appreciates all the hard work I had you do for this! ^green; Could you deliver it to them?" --- > "I think this is the perfect ^orange;. ^green;Could you deliver it to ^orange;^white;? Make sure they know it's from me!", > "Who wouldn't love a new ^orange;? I hope ^orange;^white; appreciates all the hard work I had you do for this! ^green;Could you deliver it to them?" 63c63 < "Eager. It is almost over - All you need to do now is ^green;place the ^orange;^green; in my home^white; somewhere!" --- > "Eager. It is almost over - All you need to do now is ^green;deliver the ^orange;^green; to ^orange; ^white;and then we'll be done!" 66,67c66,67 < "The only thing left to do now is ^green;deliver the ^orange^white; Could you give it to for me?", < "Now we just need to ^green;drop that ^orange^green; off to ^orange.^white; Can I ask you to take it to them? I hope they don't already have one!" --- > "The only thing left to do now is ^green;deliver the ^orange;^white; Could you give it to for me?", > "Now we just need to ^green;drop that ^orange;^green; off to ^orange;.^white; Can I ask you to take it to them? I hope they don't already have one!" 82,83c82,83 < "It looks like loved the . I'm such a good gift-giver! Well, with your help of course!", < "Horray! Now and I can be best friends! Now to figure out what I should get them next..." --- > "It looks like loved the . I'm such a good gift giver! Well, with your help of course!", > "Hooray! Now and I can be best friends! Now to figure out what I should get them next..." 109c109 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], quests\generated\subquests\intimidate.questtemplate 25c25 < "^cyan;Floran wantss to fear them." --- > "^cyan;Floran wantss more ressspect around here." 33c33 < "^cyan;You know what quality I like in others? Total subservience! I have just the way to get to respect me through fear..." --- > "^cyan;I want 's respect, but friendship takes too long. I have a better idea..." 61,62c61,62 < "The next part of my plan requires ^orange;'s^white; obedience. There's no better way to achieve this than to threaten their life! ^green;Hold a big ^orange; ^green;and go talk to them ^white;- They'll know who sent you.", < "Next, I'm going to need ^orange;^white to do anything I say. This is easiest when they fear me - Can you ^green;go and point a nice ^orange; ^green;at them and start up a conversation on my behalf?^white; That should work just fine!" --- > "The next part of my plan requires ^orange;'s^white; obedience. There's no better way to achieve this than to threaten their life! ^green;Hold a big ^orange; ^green;and go talk to them^white;. They'll know who sent you.", > "Next, I'm going to need ^orange;^white; to do anything I say. This is easiest when they fear me. Can you ^green;go and point a nice ^orange; ^green;at them and start up a conversation on my behalf?^white; That should work just fine!" 76c76 < "My plan finally comes together! I need ^orange;'s^white; utter obedience, if they fear me they'll help me out with anything I need in future! Can you ^green; point a nice ^orange; ^green;at them and strike up a conversation? ^white;They'll know you sent me, don't worry." --- > "My plan finally comes together! I need ^orange;'s^white; utter obedience, if they fear me they'll help me out with anything I need in the future! Can you ^green; point a nice ^orange; ^green;at them and strike up a conversation? ^white;They'll know I sent you, don't worry." 160a161 > "rewardParameters" : [ "rewards" ], quests\generated\subquests\kill_monster.questtemplate 30,31c30,31 < "Firsst, we need ^orange;^white;. Not hard to find, Floran ssaw lone ^orange; ^white;keep ssafe in belly. ^green;Hunt the ^orange; ^green;and bring Floran's thingsss back!", < "Firsst sstep, Floran need you to go on a little hunt. Floran sssaw ^orange; ^white;nearby swallow ^orange;. Greedy ^orange;! ^green;Hunt it and bring Floran the stuff from inssside." --- > "Firsst, we need ^orange;^white;. Not hard to find, Floran ssaw lone keep ssafe in belly. ^green;Hunt the ^orange; ^green;and bring Floran's thingsss back!", > "Firsst sstep, Floran need you to go on a little hunt. Floran sssaw ^orange; ^white;nearby swallow ^orange;. ^white;Greedy ! ^green;Hunt it and bring Floran the stuff from inssside." 39c39 < "The first thing we'll need is ^orange;.^white; Unfortunately, an oversized ^orange;^white; ate my supplies. It should be lurking around nearby. Could you ^green;find that ^orange;^green; and bring them back?" --- > "The first thing we'll need is ^orange;.^white; Unfortunately, an oversized ate my supplies. It should be lurking around nearby. Could you ^green;kill that ^orange;^green; and bring them back?" 53c53 < "Next ^green;you'll hunt down a ^orange;. I was out walking earlier and it ambushed me and took ^orange;. Would you ^green;locate the creature and return what it's taken?" --- > "Next ^green;you'll need to hunt down a ^orange;. I was out walking earlier and it ambushed me and took ^orange;. Would you ^green;locate the creature and return what it's taken?" 91c91 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], quests\generated\subquests\protect.questtemplate 36,37c36,37 < "^cyan;I heard a rumour that are after . If you could defend them and put in a good word maybe I can earn 's trust.", < "^cyan;I want to gain trust, and I've got a plan to do so. Word is that are on their way here to settle a score with , if we could offer protection that would give us their alliegence." --- > "^cyan;I've heard might be in trouble - If I help them, they might trust me more!", > "^cyan;I've recieved information that is at risk. If I help them, they might like me more!" 51c51 < "The first concern are the reports that ^orange^white; are on their way here. I hear they're after ^orange! ^green;Do whatever you can to fend them off.^white; They need our protection!", --- > "The first concern are the reports that ^orange;^white; are on their way here. I hear they're after ^orange;! ^green;Do whatever you can to fend them off.^white; They need our protection!", 65,66c65,66 < "Next ^green;we'll need to defend against incoming ^orange^white;. I've heard that their target is ^orange^white;. If we show that we're willing to risk life and limb to ^green;protect ^orange;^white;, they will know they can trust us.", < "Next, we'll need to protect ^orange^white;. There's a group of ^orange^white; on their way here to attack them. ^green;Do whatever you can to keep them safe from harm!" --- > "Next ^green;we'll need to defend against incoming ^orange;^white;. I've heard that their target is ^orange;^white;. If we show that we're willing to risk life and limb to ^green;protect , they will know they can trust us.", > "Next, we'll need to protect ^orange;^white;. There's a group of ^orange;^white; on their way here to attack them. ^green;Do whatever you can to keep them safe from harm!" 80c80 < "^orange;^white; is in danger! It seems there's a gang of ^orange;^white; on their way with hostile intentions. ^green;Make sure they don't harm ^orange;^white;. Do whatever it takes!" --- > " is in danger! It seems there's a gang of ^orange;^white; on their way with hostile intentions. ^green;Make sure they don't harm ^orange;^white;. Do whatever it takes!" 123c123 < "Haha, are no match for us... er, I mean you! I think this will put us in 's good books - we should be able to call in a favor if we need anything.", --- > "Haha, are no match for us ... er, I mean you! I think this will put us in 's good books - we should be able to call in a favor if we need anything.", 137a138 > "rewardParameters" : [ "rewards" ], quests\generated\subquests\request_craft.questtemplate 43c43 < "Next run over and have ^orange;^white; assemble us a custom ^orange;.^white; Just ^green;mention my name, ^orange;^white; knows how I like them made." --- > "Next run over and have ^orange;^white; assemble us a custom ^orange;.^white; Just ^green;mention my name, knows how I like them made." 80a81 > "rewardParameters" : [ "rewards" ], 83,84d83 < < "rewardParameters" : [], quests\generated\subquests\return_stolen.questtemplate 47,48c47,48 < "^cyan; has been robbed! Let'ss help them out!", < "^cyan;Ssomeone's was stolen. Ressstore justice to the town!" --- > "^cyan;Floran has found out about ssshocking crime! Let's fix thisss.", > "^cyan;Ssomeone's was stolen. Help ressstore justice!" 70,71c70,71 < "Alright, I know for a fact that ^orange;^white; has been keeping ^orange;'s^white; stolen ^orange;^white; in their home. I'll keep watch while you ^green;take it back.^white; Once you've got it, ^green;place it back in ^orange;'s^green; house.", < "The first thing we've got to do involves a little bit of thievery. Well, it's a good kind of thievery. The ^orange; we need to steal back is located in ^orange;'s home. Go get it, then place it back in ^orange;'s house." --- > "Alright, I know for a fact that ^orange;^white; has stolen ^orange;?ÇÖs ^white;. I?ÇÖll keep watch while you ^green;take it back.^white; Once you?ÇÖve got it, ^green;place it back in ^orange;?ÇÖs^green; house.", > "The first thing we?ÇÖve got to do involves a little bit of thievery. Well, it's a good kind of thievery. The ^orange;^white; we need to steal back is located in ^orange;?ÇÖs home. ^green;Go get it, then place it back in ^orange;?ÇÖs^green; home." 85c85 < "A little breaking and entering never hurt anyone. Nobody we know or care about, at least. Go steal back the ^orange; in ^orange;'s house. Then put it back in ^orange;'s home." --- > "A little breaking and entering never hurt anyone. Nobody we know or care about, at least. Go ^green;steal back the ^orange; ^green; in ^orange;'s ^green; home. Then put it back in ^orange;?ÇÖs ^green; home." 99c99 < "Everything else is in place! It's time for some vigilante style burglary. I'll be your lookout while you grab the stolen ^orange; from ^orange;'s place. Then sneak it back into ^orange;'s home." --- > "Everything else is in place! It?ÇÖs time for some vigilante style burglary. I?ÇÖll be your lookout while you^green; grab the stolen ^orange;^green; from ^orange;?ÇÖs^green;place. Then sneak it back into ^orange;?ÇÖs^green; home." 113c113 < "The ^orange; we're looking for was stolen by ^orange;. Right now it's sitting in their home. ^green;Go steal it back, then ^green;place it back in ^orange;'s^green; house where it belongs. I'll be watching for trouble." --- > "The ^orange;^white; I've been looking for was stolen by ^orange;.^white; Right now it?ÇÖs sitting in their home. ^green;Go steal it back,^white; then ^green;place it back in ^orange;'s^green; house^white; where it belongs. I?ÇÖll be watching for trouble." 183c183 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], quests\generated\subquests\share_secret.questtemplate 21c21 < "^cyan;Hopeful. I have devised a plan to obtain a new friend, by the means of sharing a secret.", --- > "^cyan;Hopeful. I have devised a plan to obtain a new friend - Can you assist?", 25,26c25,26 < "^cyan;I have a secret to share with . I'm hoping this will inspire a friendship between us.", < "^cyan;I'd like to make friends with . By telling them a personal secret, I'm sure they will open up to me." --- > "^cyan;I would like to be better friends with ! Will you help me make this happen?", > "^cyan;I'd like to make friends with , and I've figured out the best way to do it!" 41c41 < "I'd like to begin by establishing a new friendship in town. ^orange;^white; has always seemed like a friendly person. Would you ^green;deliver this ^orange;note^white; to them from me?^white; It contains private information which will surely make them warm to me." --- > "I'd like to begin by making a friend, and ^orange;^white; has always seemed nice enough. Would you ^green;deliver this ^orange;note^white; to them from me?^white; Sharing secrets is how friendships begin!" 154a155 > "rewardParameters" : [ "rewards" ], quests\generated\subquests\spread_rumors.questtemplate 23,24c23,24 < "^cyan; ssseems like fun company. Let's replace their current besst friend.", < "^cyan;Floran wantss to befriend . Let's get rid of their current obnoxiouss friend! " --- > "^cyan; ssseems like fun company, and Floran has crafty plan to make friendsss with them.", > "^cyan;Floran wantss to befriend . Let's get rid of their current obnoxiouss friend!" 31,32c31,32 < "^cyan;I'd like to befriend . Let's remove their other friend from the picture. ", < "^cyan;I'd like to become my friend instead of 's. I have a plan for how to accomplish this." --- > "^cyan;I'd like to befriend . If only their friend wasn't in the way....", > "^cyan;I'd like to become my friend instead of 's. I have a plan to make this happen..." 46c46 < "I think and I would look good together as friends. They always hang out with the ugly though, so let's put a stop to that. ^green;Here's a ^orange;note^green; I want you to deliver to ^orange;^white; that will put them off seing their ugly friend again. Don't worry about what it says.", --- > "I think and I would look good together as friends. They always hang out with the ugly ^orange;^white; though, so let's put a stop to that. ^green;Here's a ^orange;note^green; I want you to deliver to ^orange;^white; that will put them off seing their ugly friend again.", 61c61 < "I want to stop being friendly with and become my friend instead. Here's a ^orange;note^white; I wrote with the truth about . ^green;Please, deliver it to ^orange;^white; for me!" --- > "I want to stop being friendly with ^orange;^white; and become my friend instead. Here's a ^orange;note^white; I wrote with the truth about . ^green;Please, deliver it to ^orange;^white; for me!" 74,75c74,75 < "Finally, let's make realise that I'm better friend material than . ^green;Show them this ^orange;note^green; that I've written^white; about and things will become obvious to them!", < "Here's a ^orange;note^white; I wrote about . Everyone knows they're a bore, and still ^orange;^white; hangs out with them every day. It's my time to be ^green;'s friend though! ^green;Please deliver this note to them." --- > "Finally, let's make ^orange; ^white;realise that I'm better friend material than ^orange;. ^green;Show them this ^orange;note^green; that I've written^white; about and things will become obvious to them!", > "Here's a ^orange;note^white; I wrote about ^orange;^white;. Everyone knows they're a bore, and still ^orange;^white; hangs out with them every day. It's my time to be ^green;'s friend though! ^green;Please deliver this note to them." 88,89c88,89 < "I wish ^orange;^white; would become my friend instead of 's. I've prepared this ^orange;note^white; for them that will explain the truth about . It will make them realise I'm much better friend material! ^green;Please deliver it to them for me.", < "I've wanted to be 's friend for ages, but they only hang out with . ^green;I've prepared this ^orange;note^green; for you to deliver to ^orange;^white;. It will tell them the truth about their friend. " --- > "I wish ^orange;^white; would become my friend instead of ^orange;'s^white;. I've prepared this ^orange;note^white; for them that will explain the truth about . It will make them realise I'm much better friend material! ^green;Please deliver it to them for me.", > "I've wanted to be 's friend for ages, but they only hang out with ^orange;^white;. ^green;I've prepared this ^orange;note^green; for you to deliver to ^orange;^white;. It will tell them the truth about their friend." 158a159 > "rewardParameters" : [ "rewards" ], quests\generated\subquests\steal.questtemplate 96c96 < "rewardParameters" : [ "extraRewards" ], --- > "rewardParameters" : [ "rewards", "extraRewards" ], scripts\status.lua 8c8 < else --- > elseif listenerType == "damageTaken" then 9a10,11 > else > sb.logInfo("Failed to create damageListener - invalid listenerType '%s'", listenerType) scripts\actions\quests.lua 94c94 < if not self.quest.isOfferingQuests then --- > if not self.quest:hasRole() then 108d107 < self.quest.isOfferingQuests = true 116,125d114 < local config = entity.configParameter("questGenerator") < < if not config.drives or #config.drives == 0 then return nil end < < if not self.drive then < math.randomseed(entity.seed()) < self.drive = util.randomChoice(config.drives) < math.randomseed(entity.seed() ~ os.time()) < end < 127c116 < self.questGenerator = QuestGenerator.new(self.drive) --- > self.questGenerator = QuestGenerator.new() scripts\quest\participant.lua 32a33,36 > function QuestParticipant:hasRole() > return not isEmpty(self.data.roles) > end > scripts\questgen\generator.lua 9,10c9 < function QuestGenerator:init(drive) < self.drive = drive --- > function QuestGenerator:init() 81,84c80,94 < self._questPool = root.assetJson("/quests/generated/"..self.drive..".config") < for name, quest in pairs(self._questPool) do < quest.name = name < end --- > self:timeFunction("loading operator json", function () > self._questPool = { > ends = {}, > quests = {} > } > for _,poolName in pairs(entity.configParameter("questGenerator.pools", {})) do > local pool = root.assetJson("/quests/generated/"..poolName..".config") > for _,entry in pairs(pool.ends) do > self._questPool.ends[#self._questPool.ends+1] = entry > end > for key,quest in pairs(pool.quests) do > self._questPool.quests[key] = quest > end > end > end) 89,94d98 < function QuestGenerator:subquests() < return self:timeFunction("loading operator json", function () < return root.assetJson("/quests/generated/subquests.config") < end) < end < 125c129 < self.operatorTable:addOperators(self:subquests()) --- > self.operatorTable:addOperators(self:questPool().quests) 156c160 < -- There are two kinds of quest sequences in the drive pools, defined by --- > -- There are two kinds of quest sequences in the quest pools, defined by 265,278c269,273 < function QuestGenerator:chooseQuest(pool) < local totalWeight = 0 < for _,option in pairs(pool) do < totalWeight = totalWeight + (option.weight or 1) < end < < local choice = math.random() * totalWeight < for _,option in pairs(pool) do < choice = choice - (option.weight or 1) < if choice < 0 then < return option < end < end < return nil --- > function QuestGenerator:chooseFinalQuest() > local ends = self:questPool().ends > if #ends == 0 then return nil end > local choice = util.weightedRandom(ends) > return self:questPool().quests[choice] 442c437 < questSpec = questSpec or self:chooseQuest(self:questPool()) --- > questSpec = questSpec or self:chooseFinalQuest() 466a462,469 > > if operation.config.rewardPool then > local treasure = root.createTreasure(operation.config.rewardPool, world.threatLevel()) > parameters.rewards = { > type = "itemList", > items = treasure > } > end scripts\questgen\relations.lua 450,453d449 < QuestRelations.trusts = defineRelation("trusts", false, NpcRelationship) { < opposite = function() return QuestRelations.fears end < } < 459,460c455 < QuestRelations.likes.new(true, self.predicands, self.context), < QuestRelations.trusts.new(true, self.predicands, self.context) --- > QuestRelations.likes.new(true, self.predicands, self.context) stats\effects\deathbomb\deathbomb.lua 1a2,5 > if status.resourceMax("health") < effect.configParameter("minMaxHealth", 0) then > effect.expire() > end > 15c19 < if not status.resourcePositive("health") then --- > if not status.resourcePositive("health") and status.resourceMax("health") >= effect.configParameter("minMaxHealth", 0) then 27c31,42 < world.spawnProjectile(effect.configParameter("bombProjectile"), mcontroller.position(), 0, {0, 0}, false, { power = bombPower, damageTeamType = "assistant" }) --- > local projectileConfig = { > damageTeamType = "assistant", > onlyHitTerrain = true, > timeToLive = 0, > actionOnReap = { > { > action = "config", > file = effect.configParameter("bombConfig") > } > } > } > world.spawnProjectile("invisibleprojectile", mcontroller.position(), 0, {0, 0}, false, projectileConfig) stats\effects\deathbomb\deathbombelectric.statuseffect 3a4 > "minMaxHealth" : 5, 5c6 < "bombProjectile" : "electricexplosionfreeze", --- > "bombConfig" : "/projectiles/explosions/regularexplosion2/electricexplosionfreeze.config", stats\effects\deathbomb\deathbombfire.statuseffect 3a4 > "minMaxHealth" : 5, 5c6 < "bombProjectile" : "fireexplosionfreeze", --- > "bombConfig" : "/projectiles/explosions/regularexplosion2/fireexplosionfreeze.config", stats\effects\deathbomb\deathbombice.statuseffect 3a4 > "minMaxHealth" : 5, 5c6 < "bombProjectile" : "iceexplosionfreeze", --- > "bombConfig" : "/projectiles/explosions/regularexplosion2/iceexplosionfreeze.config", stats\effects\deathbomb\deathbombpoison.statuseffect 3a4 > "minMaxHealth" : 5, 5c6 < "bombProjectile" : "poisonexplosionfreeze", --- > "bombConfig" : "/projectiles/explosions/regularexplosion2/poisonexplosionfreeze.config", stats\effects\elementalaura\iceaura.animation 16c16 < "cycle" : 1.5, --- > "cycle" : 0.9, 55c55,56 < { "particle" : "iceswoosh3"} --- > { "particle" : "iceswoosh3"}, > { "particle" : "iceaura"} stats\effects\elementalaura\poisonaura.animation 55c55,56 < { "particle" : "fireswoosh2"} --- > { "particle" : "fireswoosh2"}, > { "particle" : "poisonaura"} tenants\other\hazmat.tenant 15c15 < "species": ["human", "apex", "hylotl"], --- > "species": ["human", "apex"], vehicles\hoverbike\hoverbike.animation 119a120,133 > }, > > "particleEmitters" : { > "smoke" : { > "transformationGroups" : ["flip", "rotation"], > "emissionRate" : 0.0, > "particles" : [{ > "particle" : "crabcanosmoke", > "offset" : [-3, 0] > }] > } > }, > > "sounds" : { vehicles\hoverbike\hoverbike.lua 24a25,27 > self.maxSmokeRate = 20 > self.minDamageCollisionAccel = 40 > self.terrainCollisionDamage = 10 25a29,30 > self.terrainCollisionDamageSourceKind = "falling" > self.accelerationTrackingCount = 3 39a45,47 > self.lastPosition = mcontroller.position() > self.collisionTrackingVelocities = {} > self.selfDamageNotifications = {} 43,45c51,54 < local groundDistance = minimumSpringDistance(self.bodySpringPositions) < local nearGround = groundDistance < self.nearGroundDistance < local entityInSeat = vehicle.entityLoungingIn("seat") --- > move() > animate() > updateDamage() > end 47,48c56,61 < if entityInSeat then < vehicle.setDamageTeam(world.entityDamageTeam(entityInSeat)) --- > function applyDamage(damageRequest) > local damage = 0 > if damageRequest.damageType == "Damage" then > damage = damage + root.evalFunction2("protection", damageRequest.damage, self.protection) > elseif damageRequest.damageType == "IgnoresDef" then > damage = damage + damageRequest.damage 50c63 < vehicle.setDamageTeam({type = "indiscriminate"}) --- > return 52a66,89 > self.health = self.health - damage > > return {{ > sourceEntityId = damageRequest.sourceEntityId, > targetEntityId = entity.id(), > position = mcontroller.position(), > damage = damage, > damageSourceKind = damageRequest.damageSourceKind, > targetMaterialKind = self.materialKind, > killed = self.health <= 0 > }} > end > > function selfDamageNotifications() > local sdn = self.selfDamageNotifications > self.selfDamageNotifications = {} > return sdn > end > > function move() > local groundDistance = minimumSpringDistance(self.bodySpringPositions) > local nearGround = groundDistance < self.nearGroundDistance > local entityInSeat = vehicle.entityLoungingIn("seat") > 108a146,148 > end > > function animate() 114,115c154,158 < if self.health <= 0 then < vehicle.destroy() --- > if self.health < self.maxHealth then > animator.setParticleEmitterActive("smoke", true) > animator.setParticleEmitterEmissionRate("smoke", (1.0 - self.health / self.maxHealth) * self.maxSmokeRate) > else > animator.setParticleEmitterActive("smoke", false) 119,124c162,164 < function applyDamage(damageRequest) < local damage = 0 < if damageRequest.damageType == "Damage" then < damage = damage + root.evalFunction2("protection", damageRequest.damage, self.protection) < elseif damageRequest.damageType == "IgnoresDef" then < damage = damage + damageRequest.damage --- > function updateDamage() > if entityInSeat then > vehicle.setDamageTeam(world.entityDamageTeam(entityInSeat)) 126c166 < return --- > vehicle.setDamageTeam({type = "passive"}) 129c169,171 < self.health = self.health - damage --- > if self.health <= 0 then > vehicle.destroy() > end 131,139c173,205 < return {{ < sourceEntityId = damageRequest.sourceEntityId, < targetEntityId = entity.id(), < position = mcontroller.position(), < damage = damage, < damageSourceKind = damageRequest.damageSourceKind, < targetMaterialKind = self.materialKind, < killed = self.health <= 0 < }} --- > local newPosition = mcontroller.position() > local newVelocity = vec2.div(vec2.sub(newPosition, self.lastPosition), script.updateDt()) > self.lastPosition = newPosition > > if mcontroller.isColliding() then > local maxAccel = 0 > for _, v in ipairs(self.collisionTrackingVelocities) do > local accel = vec2.mag(vec2.sub(newVelocity, v)) > if accel > maxAccel then > maxAccel = accel > end > end > > if maxAccel >= self.minDamageCollisionAccel then > self.health = self.health - self.terrainCollisionDamage > self.collisionTrackingVelocities = {} > > table.insert(self.selfDamageNotifications, { > sourceEntityId = entity.id(), > targetEntityId = entity.id(), > position = mcontroller.position(), > damage = self.terrainCollisionDamage, > damageSourceKind = self.terrainCollisionDamageSourceKind, > targetMaterialKind = self.materialKind, > killed = self.health <= 0 > }) > end > end > > table.insert(self.collisionTrackingVelocities, newVelocity) > while #self.collisionTrackingVelocities > self.accelerationTrackingCount do > table.remove(self.collisionTrackingVelocities, 1) > end vehicles\hoverbike\hoverbike.vehicle 28,29c28,29 < "hoverVelocityFactor" : 5, < "hoverControlForce" : 800, --- > "hoverVelocityFactor" : 8, > "hoverControlForce" : 650, 34c34 < "jumpVelocity" : 50, --- > "jumpVelocity" : 40, weather\ash\ash.weather 60,61d59 < < weather\fog\fog.weather 19,20d18 < < weather\rain\rain.weather 76a77,87 > }, > { > "projectile" : "waterstatus", > "parameters" : { > "power" : 0 > }, > "velocity" : [0, -100], > "ratePerX" : 0.1, > "spawnAboveRegion" : 30, > "spawnHorizontalPad" : 10, > "windAffectAmount" : 1 weather\rain\storm.weather 72a73,83 > }, > { > "projectile" : "waterstatus", > "parameters" : { > "power" : 0 > }, > "velocity" : [0, -100], > "ratePerX" : 0.1, > "spawnAboveRegion" : 30, > "spawnHorizontalPad" : 10, > "windAffectAmount" : 1