From 1f364c1bcf4df2a6b12a868ec5f2420206edb74a Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 17 Aug 2016 20:31:37 -0400 Subject: [PATCH 01/23] Kinetic Smasher --- code/__DEFINES/misc.dm | 5 + code/datums/mind.dm | 7 +- code/game/gamemodes/blob/blobs/blob_mobs.dm | 1 + code/game/gamemodes/miniantags/borer/borer.dm | 2 +- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 1 + .../gamemodes/miniantags/revenant/revenant.dm | 1 + code/game/machinery/doors/door.dm | 6 +- code/game/machinery/doors/windowdoor.dm | 4 +- code/game/objects/effects/overlays.dm | 7 ++ code/game/objects/items/weapons/twohanded.dm | 29 +++-- code/modules/clothing/spacesuits/rig.dm | 6 + .../spreading/spreading_response.dm | 2 +- code/modules/mining/equipment_locker.dm | 106 +++++++++++++++++- code/modules/mob/inventory.dm | 35 ++++++ .../living/carbon/alien/humanoid/empress.dm | 1 + .../mob/living/carbon/alien/larva/larva.dm | 1 + .../mob/living/carbon/human/inventory.dm | 38 +------ code/modules/mob/living/living_defines.dm | 1 + code/modules/mob/living/silicon/ai/ai.dm | 1 + code/modules/mob/living/silicon/pai/pai.dm | 2 +- .../mob/living/silicon/robot/drone/drone.dm | 1 + .../mob/living/simple_animal/bot/ed209bot.dm | 1 + .../mob/living/simple_animal/bot/mulebot.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 1 + .../simple_animal/friendly/butterfly.dm | 1 + .../mob/living/simple_animal/friendly/cat.dm | 1 + .../living/simple_animal/friendly/corgi.dm | 1 + .../mob/living/simple_animal/friendly/crab.dm | 1 - .../living/simple_animal/friendly/diona.dm | 2 +- .../simple_animal/friendly/farm_animals.dm | 4 +- .../living/simple_animal/friendly/lizard.dm | 2 +- .../living/simple_animal/friendly/mouse.dm | 2 +- .../mob/living/simple_animal/friendly/pet.dm | 1 + .../simple_animal/friendly/spiderbot.dm | 2 +- .../mob/living/simple_animal/hostile/alien.dm | 1 + .../mob/living/simple_animal/hostile/bat.dm | 2 +- .../mob/living/simple_animal/hostile/bees.dm | 2 +- .../mob/living/simple_animal/hostile/carp.dm | 1 + .../simple_animal/hostile/mining_mobs.dm | 1 + .../living/simple_animal/hostile/syndicate.dm | 1 + .../mob/living/simple_animal/hostile/tree.dm | 1 + .../mob/living/simple_animal/parrot.dm | 2 +- code/modules/mob/mob.dm | 5 +- code/modules/mob/mob_defines.dm | 1 - code/modules/shuttle/supply.dm | 2 +- icons/mob/back.dmi | Bin 90954 -> 91661 bytes icons/mob/inhands/items_lefthand.dmi | Bin 175913 -> 176457 bytes icons/mob/inhands/items_righthand.dmi | Bin 174074 -> 174630 bytes icons/obj/mining.dmi | Bin 52799 -> 53624 bytes 49 files changed, 221 insertions(+), 76 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 37c45ba954d..7a585461657 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -20,6 +20,11 @@ #define CLICK_CD_POINT 10 #define CLICK_CD_RESIST 20 +//Sizes of mobs, used by mob/living/var/mob_size +#define MOB_SIZE_TINY 0 +#define MOB_SIZE_SMALL 1 +#define MOB_SIZE_HUMAN 2 +#define MOB_SIZE_LARGE 3 /// #define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued. diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 7935e504e09..7c9d7f4a85c 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1644,9 +1644,4 @@ /mob/living/simple_animal/construct/armoured/mind_initialize() ..() mind.assigned_role = "Juggernaut" - mind.special_role = SPECIAL_ROLE_CULTIST - -/mob/living/simple_animal/vox/armalis/mind_initialize() - ..() - mind.assigned_role = "Armalis" - mind.special_role = SPECIAL_ROLE_RAIDER + mind.special_role = SPECIAL_ROLE_CULTIST \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 5b0884788b9..67229b51a1a 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -160,6 +160,7 @@ minbodytemp = 0 maxbodytemp = 360 force_threshold = 10 + mob_size = MOB_SIZE_LARGE environment_smash = 3 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 7bc3ce06c76..cd7a95ea619 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -76,7 +76,7 @@ attacktext = "nips" friendly = "prods" wander = 0 - small = 1 + mob_size = MOB_SIZE_SMALL density = 0 pass_flags = PASSTABLE ventcrawler = 2 diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 1f9f5ff115a..b2a4f56ec13 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -60,6 +60,7 @@ faction = list("swarmer") projectiletype = /obj/item/projectile/beam/disabler pass_flags = PASSTABLE + mob_size = MOB_SIZE_TINY ventcrawler = 2 ranged = 1 ranged_cooldown_cap = 1 diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index e8f3e9b5498..8356e5a9731 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -34,6 +34,7 @@ density = 0 flying = 1 anchored = 1 + mob_size = MOB_SIZE_TINY pass_flags = PASSTABLE | PASSGRILLE | PASSMOB var/essence = 75 //The resource of revenants. Max health is equal to three times this amount diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 8c5a1fd85fc..18879cfdc9b 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -62,11 +62,11 @@ /obj/machinery/door/Bumped(atom/AM) if(p_open || operating) return - if(ismob(AM)) - var/mob/M = AM + if(isliving(AM)) + var/mob/living/M = AM if(world.time - M.last_bumped <= 10) return //Can bump-open one airlock per second. This is to prevent shock spam. M.last_bumped = world.time - if(!M.restrained() && !M.small) + if(!M.restrained() && M.mob_size > MOB_SIZE_SMALL) bumpopen(M) return diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index cbad06fab9c..76f6c7e94d3 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -52,8 +52,8 @@ return if(!ticker) return - var/mob/M = AM - if(!M.restrained() && !M.small) + var/mob/living/M = AM + if(!M.restrained() && M.mob_size > MOB_SIZE_SMALL) bumpopen(M) return diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 35ed65ad0df..62760324f76 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -64,6 +64,13 @@ duration = 8 randomdir = 0 +/obj/effect/overlay/temp/kinetic_blast + name = "kinetic explosion" + icon = 'icons/obj/projectiles.dmi' + icon_state = "kinetic_blast" + layer = 4.1 + duration = 4 + /obj/effect/overlay/palmtree_r name = "Palm tree" icon = 'icons/misc/beach2.dmi' diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index da21397529d..0c5e8140647 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -82,13 +82,6 @@ user.put_in_inactive_hand(O) return -/obj/item/weapon/twohanded/mob_can_equip(mob/M, slot) - //Cannot equip wielded items. - if(wielded) - to_chat(M, "Unwield the [name] first!") - return 0 - return ..() - /obj/item/weapon/twohanded/dropped(mob/user) ..() //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand @@ -108,6 +101,12 @@ else //Trying to wield it wield(user) + +/obj/item/weapon/twohanded/equip_to_best_slot(mob/M) + if(..()) + unwield(M) + return + ///////////OFFHAND/////////////// /obj/item/weapon/twohanded/offhand w_class = 5 @@ -130,7 +129,7 @@ return /obj/item/weapon/twohanded/required/mob_can_equip(M as mob, slot) - if(wielded) + if(wielded && !slot_flags) to_chat(M, "[src.name] is too cumbersome to carry with anything but your hands!") return 0 return ..() @@ -140,12 +139,18 @@ if(get_dist(src,user) > 1) return 0 if(H != null) - to_chat(user, "[src.name] is too cumbersome to carry in one hand!") + to_chat(user, "[src] is too cumbersome to carry in one hand!") return - var/obj/item/weapon/twohanded/offhand/O = new(user) - user.put_in_inactive_hand(O) + if(src.loc != user) + wield(user) ..() - wielded = 1 + +/obj/item/weapon/twohanded/required/equipped(mob/user, slot) + ..() + if(slot == slot_l_hand || slot == slot_r_hand) + wield(user) + else + unwield(user) /* * Fireaxe diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 355b511c391..6fad0961ab4 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -30,6 +30,12 @@ "Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi', ) +/obj/item/clothing/head/helmet/space/rig/equip_to_best_slot(mob/M) + if(rig_restrict_helmet) + to_chat(M, "You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)") // Stop RIG helmet equipping + return 0 + ..() + /obj/item/clothing/head/helmet/space/rig/attack_self(mob/user) toggle_light(user) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index 5de1ba34473..8145cb13ad4 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -7,7 +7,7 @@ if(!istype(M)) return - if(!buckled_mob && !M.buckled && !M.anchored && (M.small || prob(round(seed.get_trait(TRAIT_POTENCY)/6)))) + if(!buckled_mob && !M.buckled && !M.anchored && ((M.mob_size <= MOB_SIZE_SMALL) || prob(round(seed.get_trait(TRAIT_POTENCY)/6)))) //wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation), //so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines. spawn(1) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 2c71d1aebbd..e4313b748b7 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -331,6 +331,7 @@ new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/device/mine_bot_ugprade, 400), new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/device/mine_bot_ugprade/health, 400), new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/device/mine_bot_ugprade/cooldown, 600), + new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/weapon/twohanded/required/mining_hammer, 750), new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000), new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500), new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/weapon/storage/firstaid/brute, 600), @@ -458,7 +459,7 @@ ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/weapon/mining_voucher/voucher, mob/redeemer) - var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner") + var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner", "Crusher") if(!selection || !Adjacent(redeemer) || voucher.loc != redeemer) return switch(selection) @@ -470,6 +471,8 @@ new /obj/item/weapon/storage/box/drone_kit(src.loc) if("Advanced Scanner") new /obj/item/device/t_scanner/adv_mining_scanner(src.loc) + if("Crusher") + new /obj/item/weapon/twohanded/required/mining_hammer(loc) qdel(voucher) /obj/machinery/mineral/equipment_vendor/ex_act(severity, target) @@ -1108,3 +1111,104 @@ C.preserved = 1 to_chat(user, "You inject the hivelord core with the stabilizer. It will no longer go inert.") qdel(src) + +/*********************Mining Hammer****************/ +/obj/item/weapon/twohanded/required/mining_hammer + icon = 'icons/obj/mining.dmi' + icon_state = "mining_hammer1" + item_state = "mining_hammer1" + name = "proto-kinetic crusher" + desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club.\ + While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna. \ + \nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \ + This weapon is only particularly effective against large creatures." + force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times + w_class = 4 + slot_flags = SLOT_BACK + force_unwielded = 20 //It's never not wielded so these are the same + force_wielded = 20 + throwforce = 5 + throw_speed = 4 + light_range = 4 + armour_penetration = 10 + materials = list(MAT_METAL=1150, MAT_GLASS=2075) + hitsound = 'sound/weapons/bladeslice.ogg' + attack_verb = list("smashes", "crushes", "cleaves", "chops", "pulps") + sharp = 1 + edge = 1 + var/charged = 1 + var/charge_time = 16 + var/atom/mark = null + var/marked_image = null + +/obj/item/projectile/destabilizer + name = "destabilizing force" + icon_state = "pulse1" + damage = 0 //We're just here to mark people. This is still a melee weapon. + damage_type = BRUTE + flag = "bomb" + range = 6 + var/obj/item/weapon/twohanded/required/mining_hammer/hammer_synced = null + +/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0, hit_zone) + if(hammer_synced) + if(hammer_synced.mark == target) + return ..() + if(isliving(target)) + if(hammer_synced.mark && hammer_synced.marked_image) + hammer_synced.mark.underlays -= hammer_synced.marked_image + hammer_synced.marked_image = null + var/mob/living/L = target + if(L.mob_size >= MOB_SIZE_LARGE) + hammer_synced.mark = L + var/image/I = image('icons/effects/effects.dmi', loc = L, icon_state = "shield2",pixel_y = (-L.pixel_y),pixel_x = (-L.pixel_x)) + L.underlays += I + hammer_synced.marked_image = I + var/target_turf = get_turf(target) + if(istype(target_turf, /turf/simulated/mineral)) + var/turf/simulated/mineral/M = target_turf + new /obj/effect/overlay/temp/kinetic_blast(M) + M.gets_drilled(firer) + ..() + +/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag) + if(!proximity_flag && charged)//Mark a target, or mine a tile. + var/turf/proj_turf = get_turf(src) + if(!istype(proj_turf, /turf)) + return + var/datum/gas_mixture/environment = proj_turf.return_air() + var/pressure = environment.return_pressure() + if(pressure > 50) + playsound(user, 'sound/weapons/empty.ogg', 100, 1) + return + var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(user.loc) + D.preparePixelProjectile(target,get_turf(target), user) + D.hammer_synced = src + playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1) + D.fire() + charged = 0 + icon_state = "mining_hammer1_uncharged" + spawn(charge_time) + Recharge() + return + if(proximity_flag && target == mark && isliving(target)) + var/mob/living/L = target + PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, get_turf(L)) + mark = 0 + if(L.mob_size >= MOB_SIZE_LARGE) + L.underlays -= marked_image + qdel(marked_image) + marked_image = null + var/backstab = check_target_facings(user, L) + var/def_check = L.getarmor(type = "bomb") + if(backstab == 3 || backstab == 1) + L.apply_damage(80, BRUTE, blocked = def_check) + playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong + else + L.apply_damage(50, BRUTE, blocked = def_check) + +/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge() + if(!charged) + charged = 1 + icon_state = "mining_hammer1" + playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) \ No newline at end of file diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 9ebbb29ac02..7868c37c726 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -161,6 +161,41 @@ return items +/obj/item/proc/equip_to_best_slot(mob/M) + if(src != M.get_active_hand()) + to_chat(M, "You are not holding anything to equip!") + return 0 + + if(M.equip_to_appropriate_slot(src)) + if(M.hand) + M.update_inv_l_hand(0) + else + M.update_inv_r_hand(0) + return 1 + + if(M.s_active && M.s_active.can_be_inserted(src,1)) //if storage active insert there + M.s_active.handle_item_insertion(src) + return 1 + + var/obj/item/weapon/storage/S = M.get_inactive_hand() + if(istype(S) && S.can_be_inserted(src,1)) //see if we have box in other hand + S.handle_item_insertion(src) + return 1 + + S = M.get_item_by_slot(slot_belt) + if(istype(S) && S.can_be_inserted(src,1)) //else we put in belt + S.handle_item_insertion(src) + return 1 + + S = M.get_item_by_slot(slot_back) //else we put in backpack + if(istype(S) && S.can_be_inserted(src,1)) + S.handle_item_insertion(src) + playsound(src.loc, "rustle", 50, 1, -5) + return 1 + + to_chat(M, "You are unable to equip that!") + return 0 + /mob/proc/get_all_slots() return list(wear_mask, back, l_hand, r_hand) diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm index d2553c9a28f..b49bc8c1ad1 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm @@ -5,6 +5,7 @@ health = 700 icon_state = "alienq_s" status_flags = CANPARALYSE + mob_size = MOB_SIZE_LARGE move_delay_add = 3 large = 1 ventcrawler = 0 diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index e2bf7ffd570..040646d66db 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -3,6 +3,7 @@ real_name = "alien larva" icon_state = "larva0" pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL maxHealth = 30 health = 30 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 0264e874d17..0aa2daa0f4f 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -2,41 +2,9 @@ set name = "quick-equip" set hidden = 1 - if(ishuman(src)) - var/mob/living/carbon/human/H = src - var/obj/item/I = H.get_active_hand() - var/obj/item/weapon/storage/S = H.get_inactive_hand() - if(!I) - to_chat(H, "You are not holding anything to equip.") - return - - if(istype(I, /obj/item/clothing/head/helmet/space/rig)) // If the item to be equipped is a rigid suit helmet - var/obj/item/clothing/head/helmet/space/rig/C = I - if(C.rig_restrict_helmet) - to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping. - - return 0 - - if(H.equip_to_appropriate_slot(I)) - if(hand) - update_inv_l_hand(0) - else - update_inv_r_hand(0) - else if(s_active && s_active.can_be_inserted(I,1)) //if storage active insert there - s_active.handle_item_insertion(I) - else if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //see if we have box in other hand - S.handle_item_insertion(I) - else - S = H.get_item_by_slot(slot_belt) - if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) //else we put in belt - S.handle_item_insertion(I) - else - S = H.get_item_by_slot(slot_back) //else we put in backpack - if(istype(S, /obj/item/weapon/storage) && S.can_be_inserted(I,1)) - S.handle_item_insertion(I) - else - to_chat(H, "\red You are unable to equip that.") - + var/obj/item/I = get_active_hand() + if(I) + I.equip_to_best_slot(src) /mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1) for(var/slot in slots) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 19dc6f99cd1..c142c8d28d1 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -34,6 +34,7 @@ var/implanting = 0 //Used for the mind-slave implant var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. var/floating = 0 + var/mob_size = MOB_SIZE_HUMAN var/nightvision = 0 var/bloodcrawl = 0 //0 No blood crawling, 1 blood crawling, 2 blood crawling+mob devour diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5be1bcc458a..63e580fd483 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -41,6 +41,7 @@ var/list/ai_verbs_default = list( anchored = 1 // -- TLE density = 1 status_flags = CANSTUN|CANPARALYSE|CANPUSH + mob_size = MOB_SIZE_LARGE can_strip = 0 var/list/network = list("SS13","Telecomms","Research Outpost","Mining Outpost") var/obj/machinery/camera/current = null diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 90f39288736..7979ad150b4 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -5,7 +5,7 @@ robot_talk_understand = 0 emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person) - small = 1 + mob_size = MOB_SIZE_TINY pass_flags = PASSTABLE density = 0 holder_type = /obj/item/weapon/holder/pai diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 1089e05862a..569b1a535fe 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -16,6 +16,7 @@ local_transmit = 1 ventcrawler = 2 magpulse = 1 + mob_size = MOB_SIZE_SMALL // We need to keep track of a few module items so we don't need to do list operations // every time we need them. These get set in New() after the module is chosen. diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 497393cf5d7..89e3b174377 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -10,6 +10,7 @@ damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) environment_smash = 2 //Walls can't stop THE LAW + mob_size = MOB_SIZE_LARGE radio_channel = "Security" bot_type = SEC_BOT diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index bb62af5ce35..0c751626380 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -20,7 +20,7 @@ damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) a_intent = "harm" //No swapping buckle_lying = 0 - + mob_size = MOB_SIZE_LARGE radio_channel = "Supply" bot_type = MULE_BOT diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 1d5b4da0e83..fdad2a9e37b 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -91,6 +91,7 @@ environment_smash = 2 attack_sound = 'sound/weapons/punch3.ogg' status_flags = 0 + mob_size = MOB_SIZE_LARGE construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall) force_threshold = 11 diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index 60aad72ab36..0761fbeefa8 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -17,6 +17,7 @@ density = 0 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB ventcrawler = 2 + mob_size = MOB_SIZE_TINY butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 0) gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 9c174527e8a..95a1d100161 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -14,6 +14,7 @@ speak_chance = 1 turns_per_move = 5 see_in_dark = 6 + mob_size = MOB_SIZE_SMALL simplespecies = /mob/living/simple_animal/pet/cat childtype = /mob/living/simple_animal/pet/cat/kitten butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 3) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 85eb7d10f4c..9eebdd22ccf 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -542,6 +542,7 @@ shaved = 0 density = 0 pass_flags = PASSMOB + mob_size = MOB_SIZE_SMALL //puppies cannot wear anything. /mob/living/simple_animal/pet/corgi/puppy/Topic(href, href_list) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 5d409814940..7a81f52e2b7 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -5,7 +5,6 @@ icon_state = "crab" icon_living = "crab" icon_dead = "crab_dead" - small = 1 speak_emote = list("clicks") emote_hear = list("clicks") emote_see = list("clacks") diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm index 8bb2ea57f85..3161399a66e 100644 --- a/code/modules/mob/living/simple_animal/friendly/diona.dm +++ b/code/modules/mob/living/simple_animal/friendly/diona.dm @@ -11,7 +11,7 @@ icon_dead = "nymph_dead" icon_resting = "nymph_sleep" pass_flags = PASSTABLE | PASSMOB - small = 1 + mob_size = MOB_SIZE_SMALL ventcrawler = 2 maxHealth = 50 diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 7dd9a50c828..04506c819c8 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -179,7 +179,7 @@ ventcrawler = 2 var/amount_grown = 0 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - small = 1 + mob_size = MOB_SIZE_TINY can_hide = 1 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY @@ -225,7 +225,7 @@ var/global/chicken_count = 0 var/eggsleft = 0 var/chicken_color pass_flags = PASSTABLE | PASSMOB - small = 1 + mob_size = MOB_SIZE_SMALL can_hide = 1 can_collar = 1 gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index b5c0ccedeae..ead59fa32d7 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -5,7 +5,6 @@ icon_state = "lizard" icon_living = "lizard" icon_dead = "lizard-dead" - small = 1 speak_emote = list("hisses") health = 5 maxHealth = 5 @@ -19,6 +18,7 @@ ventcrawler = 2 density = 0 pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL can_hide = 1 butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat = 1) can_collar = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 4d499e9f54f..0b0a182ed44 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -9,7 +9,6 @@ speak_emote = list("squeeks","squeeks","squiks") emote_hear = list("squeeks","squeaks","squiks") emote_see = list("runs in a circle", "shakes", "scritches at something") - small = 1 speak_chance = 1 turns_per_move = 5 see_in_dark = 6 @@ -22,6 +21,7 @@ density = 0 ventcrawler = 2 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_TINY var/mouse_color //brown, gray and white, leave blank for random layer = MOB_LAYER atmos_requirements = list("min_oxy" = 16, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index 30f55a2220f..2d7bc63dc75 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -1,6 +1,7 @@ /mob/living/simple_animal/pet icon = 'icons/mob/pets.dmi' can_collar = 1 + mob_size = MOB_SIZE_SMALL /mob/living/simple_animal/pet/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(istype(O, /obj/item/weapon/newspaper)) diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index b453cfa5ea2..38eea833e04 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -36,7 +36,7 @@ var/syndie = 0 //IS WE SYNDICAT? (currently unused) speed = -1 //Spiderbots gotta go fast. //pass_flags = PASSTABLE //Maybe griefy? - small = 1 + mob_size = MOB_SIZE_SMALL speak_emote = list("beeps","clicks","chirps") can_hide = 1 ventcrawler = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 6cd1d147211..85e0cba9073 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -129,6 +129,7 @@ move_to_delay = 4 maxHealth = 400 health = 400 + mob_size = MOB_SIZE_LARGE gold_core_spawnable = CHEM_MOB_SPAWN_INVALID /obj/item/projectile/neurotox diff --git a/code/modules/mob/living/simple_animal/hostile/bat.dm b/code/modules/mob/living/simple_animal/hostile/bat.dm index bbdf639c0f4..fdbabe2c4b7 100644 --- a/code/modules/mob/living/simple_animal/hostile/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/bat.dm @@ -15,7 +15,7 @@ speed = 4 maxHealth = 20 health = 20 - + mob_size = MOB_SIZE_TINY harm_intent_damage = 8 melee_damage_lower = 10 melee_damage_upper = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 4899eef3aaf..8c927eaefbd 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -34,7 +34,7 @@ flying = 1 search_objects = 1 //have to find those plant trays! density = 0 - small = 1 + mob_size = MOB_SIZE_TINY //Spaceborn beings don't get hurt by space atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index b7fbbec41fb..2d0dd7a2380 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -69,6 +69,7 @@ maxHealth = 65 health = 65 pixel_x = -16 + mob_size = MOB_SIZE_LARGE melee_damage_lower = 20 melee_damage_upper = 20 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 9433f4923af..19aef73d79c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -15,6 +15,7 @@ var/icon_aggro = null // for swapping to when we get aggressive see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM + mob_size = MOB_SIZE_LARGE /mob/living/simple_animal/hostile/asteroid/Aggro() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 145b908ec56..be2cfff6f0c 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -118,6 +118,7 @@ faction = list("syndicate") atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 + mob_size = MOB_SIZE_TINY flying = 1 gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE del_on_death = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 9d22827a292..508e2934cf6 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -14,6 +14,7 @@ speed = 1 maxHealth = 250 health = 250 + mob_size = MOB_SIZE_LARGE pixel_x = -16 diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 1266b31f746..026323640d8 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -33,7 +33,6 @@ icon_living = "parrot_fly" icon_dead = "parrot_dead" pass_flags = PASSTABLE - small = 1 can_collar = 1 var/list/clean_speak = list( @@ -54,6 +53,7 @@ response_harm = "swats the" stop_automated_movement = 1 universal_speak = 1 + mob_size = MOB_SIZE_SMALL var/parrot_state = PARROT_WANDER //Hunt for a perch when created var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in process_ai() being run every single tick. diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 66b0ba2b186..356dbbed693 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -866,7 +866,10 @@ var/list/slot_equipment_priority = list( \ /mob/MouseDrop(mob/M as mob) ..() if(M != usr) return - if(M.small) return // Stops pAI drones and small mobs (borers, parrots, crabs) from stripping people. --DZD + if(isliving(M)) // Ewww + var/mob/living/L = M + if(L.mob_size <= MOB_SIZE_SMALL) + return // Stops pAI drones and small mobs (borers, parrots, crabs) from stripping people. --DZD if(!M.can_strip) return if(usr == src) return if(!Adjacent(usr)) return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 323f170facd..5de39584402 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -63,7 +63,6 @@ var/canmove = 1 var/lastpuke = 0 var/unacidable = 0 - var/small = 0 var/can_strip = 1 var/list/pinned = list() //List of things pinning this creature to walls (see living_defense.dm) var/list/embedded = list() //Embedded items, since simple mobs don't have organs. diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 3451f7fbe08..3ca6c591705 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -824,7 +824,7 @@ return 1 var/mob/living/M = caller - if(!M.ventcrawler && !M.small) + if(!M.ventcrawler && M.mob_size > MOB_SIZE_SMALL) return 0 return 1 diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index a4cd1d997a858c83a04164db7e0324613e835f1a..4c7a3707efd3bf975cd495f34ea55657f3d6490a 100644 GIT binary patch delta 7100 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 bQFsakb?WE}+61Z|fH0n^Xez@VTmADtq;(9F delta 6391 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 diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index bb62430954273d379b943ba1ac1a8c848271b062..b02e2563aa4d0cbd02e4e9ab1fcf544ac4069d5d 100644 GIT binary patch delta 4867 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 diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index f4f7455ebd21603aa45df0f4bc82c0d397bd7087..59531a73db96a9469bfaafdd229c68b1e4b338af 100644 GIT binary patch delta 3212 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 delta 2652 zcmai0X;f3!7CwLlhXMkvSf*G&fybnPpkau%C<2NV1r%hmp`rw+kN^sLqlm^w8Nwhk z2skhZLL^GVn4qmBh%uB00*xdpA%QR%P#|QuFQ~ZI`|(!yy6die_t|HE-#&Nkb-v2J zwM(qE*``XOhRtu*Z0w#NrS}WCs5&><`~(vQf39!c<$K&|EY)=FRnxUf6w|fJvv_5L zKFY>)WsWw4(GeKZMKhbL*Oz03e-`!N9$`{(O*-qWCwh?18?@MWSO2Mf>$J8`5z;)> zM+@~$;1q4&)(eC>t8i_oT$XcXv7rGIY-0R?etFCR*?0Hv2V4CAwm73-_d~V1)|0dI zYVDoWLB0W3T-qv-Ev;kgat9XPGz*fbZoMyGZV1~9<#&}L)!n6}V1;D2LkpP%mViLh1 zjB;Cvc3>R<$osa_8FbR=b>un?)t^FqU}zliQ|=5o2^jz^(oV7xXR>y`bdl}933tz0Z-Cb zXiVSheF{x`ZO-+qrBXQs3-foFp_Pk4^GI$rn)B}{Dpx~Q~S20z^&Gsj|3gUIN-|xZO;C2vc$NupJVTEA|exb|! z0IL7K($+-&{bV1n*!p94_%BNQYI9t0lC1MDQ{x4zg0Dc1|5)%NCgiYOwTDc!X_U4X zq{zNvbaRtEuV-NIMVJITD1)TRU(^95H%B9P3_Faf-R{?&}a+XLti{qI< zb3%rPoZnB(k}_*e5aQwh54Tw-h?JSaiw!XpGf*Wso-Oj>V(3_(ykB_nq-{SsRMREd z^TPWHs1F?qp8u4qx(o8SN;a!VZif6*-zQ=tK0K%->Hr{Q|3NK-nZT zzao`+$R8WSy$mkILs-q)X8cd!el;JeI7NzpB+x5XY)kUy(tXv3B>@Ax85aA_&SR}7 z_F5-wjtY35P4S4|KBNomzljE4&tq=b6%q(mi^&BFoLaF8_wan#O_DRjf00&KGuo+M z$T&b?3}34mbej^G#p(3Mja)ey{9ZvzZ*u6h_;OFlxW9P2(b=28r^0WG{prT@_Z90amHKD zi$!Jn%6$Tg<^vm-Dw7*0(`J8c^%rwijlFUT!%gcynA~y=Avx;UTT$;Y)reeBKU!88 zIzzVs8*3sZv%(vU0LaeDwH-=h(NZoPz5bjkX<{9nn=B5x9PU4F8pDp4jtD{#%{KjgyX6(lOgL@lwhuDRtI8}0iOYsg{RYjRl%{7x zVyW7RGyOaAG+f~E<;-pJt}=1xW$AaYF%R)n6uKXoKO0SCd*76(T1hnUivL_2J2SZ; z%ls;t$bqsJelK44@e~)W!1M45-+MKj*F3rUGpczcSKMu3R*k?6-L8L?SoSqMb6(7> z3nI_*uH~3Dq)!OJuX8n@k=c}rDoQ}H4kwJI`k}7M?fcdX3-yG3k1t0#v$-Tk zSGetXiHv~GG|VHRKHRPPfZ();aLybPyy+lieWAK#k0HB zNMZx6GLuKp>Xxe-(ZYYz0afVUOgk+ z(uwb2P7PK{l1z8*A_Y&15NN|K8BlU@Ih~dvnt`l!1dzb^+|dp28zXhlah&Q1+^6NK zJpMZJo^=^P#I7skQ#YqV{>H7;D3;C$J`aRXdeEEtYa8>{Jid(K)H z#@+ja+00&s!xbn>IUCtJG-k#LVkiPQxm^{s^hA{QLKPYSPiF|Ry=Cc3z zW?2qvfO6Ui!LN$kIJPpVp&Nc82SA7Y&{1h|#*gDD?!;LNTM0b*UO(OTw1HP>yh{Pb zz^lxXJe4O%m$`r$g@|~*=d;iNgssc{EgF8&ARo1f(dSR&F*u|2f!+OtCl$*P&pkfw J^*@AN`Y$FWAF2QV diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index abd43759c9434bca58c9c648303c6974f48ba8a0..c39dbef36a825c2f9d3912a80db9b076dfcce09c 100644 GIT binary patch delta 10632 zcmXw9bzBtT*4`xqq(h`bKtiOuySq`OrIqfOr8}fViKSBzkdp3hNs*4F8)>-Xz2C=!ibc#?{BO$g2qOX#YjXTs8C|DTB$i@i%9lu|mNVI5Nh~_4R<^0e!^b~; z;xu2gotcac`Wxsh$~PGg|6=uTNXyBe(UOR(ujufdXUHTj9gEQ0={VPP8&TVO2#Xnx zf>SmNkoWO;A?L;jPoi1k-vH4alcq8bsD85#waPNeughUaarCx}g{8m6rR(OJ$Holh08Y}E)j5RPW(A$6>SLHG$<-oSF<~YsyHy>E{G|m2$x?Gr( z=pgae0FBI%$5!U&yZhFccJ+-cyIhsEj3i1icS%-i5Oj>#&fwvbi74( zXPm1xmL?C)nrJ*lcNpk3lTLMb>tPyW$^Q`jIk;SSg*d&W{cY`UwrQ6iY7Y=)>#eWO z%`b2v5E_W0jHHfN#(v8WOeEG~06|45n{ssP=&rA?Uv!pCPs0K0oIpp46N(G=>`eA+D|6=90!RG$`yG9>C7n08--YrkVt4s z;KZZ!=lwdWD7}@xsL*LE6Iy&1I}fil$lt4K(`_od{Qh^T?f&*aWmkj%C^c54q3L!< ziU=D+NC()KIE2{ED!f7D3|qO%;I0|l0dqgC@@2OTZ=PEEdUT#Y5QFlJL)OfoKIFD#-1Jf1Ma$`i zuM#vg2<6B?rl`s{(y>;*mf>CUCf{cYupz!}-lVF4ztXIr+}@>o?le%{m8SYyc>-MT z9m1<65WSDo-3_;VE-Gqcidpe*)(t@;mPWIp$7?x-7FG6>7~FXP&PGS{>VSvWp%yK6{qEn_n~mB1#Hd;Nnv0d& z*a`TF;=fvU9)tk!yrn{G0k+hWNGrEaF!#G*7pz z_-&@Yc~x#_>C{D0nJm=nl6tdMx|P0Km9h#DUh_Ktc=!qrodyj1WtM1b zr9{435uu+`M`_=>q_i}0p;~6tVv}dy&fHT20h|ChZVH`#c4_HTioT9jCmR>%Onyfy z*tFN<6(+}-h{{XC#>U2RH*aQ^zSa;y*RA$Vmz(Hv+H)}j5V88CjrwR z^X=8F&BotF9@oxt%E~ZFNFE;wRnx7C15Dz>{2dmByhNx9jLFH#>9Pz@S=GOAq0)Eb zW5CMdbR+`EFD@?78y3Gd&svRUlnAiSIq>cOuEhkv5;8pOc!F?Zm6dg2PcwrgVWi~g znGYs2_YVwo%#^>~{7h7Vnc6H8k&CWLr0Kn2H=NFo>)3LkM`l;$X+$_tiLu*1KEPTL zL#*4#Pw&!)a|C6upYA#mzWY5;cPvB;pYFTd8tI%}!a)HPx~0Pr-r!2%T~JB9_A`+T zK&^;Cmn1;5boVj^N~#SE8^}B z9x$(c!A~;Xz$8$o7O=6nxacH6aqJ~>3|#vu=~(<+^Go0f!Q%oOnog16DJG^_l|eFM zVR#T9pCk#xSM8hDqF4H-tBSrp+TVD^!x78a4%O)pS|+BI=$bn=Fem#B{ut?`Ka|g|L|Bs zA7ViwH;_aShyN+);&@`Vtm8~1K=~c0$;YczcUG@ z4qI^_vRv!G6H@KdYq#XHm>d}+2OeU6(KgK8a4uHnk-~K_%4X4R$7doc*Z3_NcF-44uxZeAfVBF44mz}sUQRg+8jm^za zOP)fRTw6+wMl4O%wH=$>WVVIJn9eDIy-CbP+{xN>7eCyKZBUV4Snsemg!}6cbe9l9QZ$xjuWVMwiK_H`X zIHnO|{=Oe82s&WfeZoC9_pNGP_ZGULA*=0Zj3yy?8D~=$cenSn2;0X8{L_2iAZdG_ z3&k^K4_W639ILPx<{^XIM9 z$ijT#$}a|oXregq={ZwhT>HVE(_&18nK;f~&}r;>dV0RXe1o=uOcjq_rpp%g-thh1 zJ3N%D`+zGyB$~ll$w}hRbFw3`kO}I57D}`Vq)Qxc0um%yxREjq9&CXUHh|(}ewA4z&Qf6iHQUZs1

Po1h7wRJ8u#HyW^e*XI7qV?l*x_ttz)H+OSUF&+ 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ͤA|&{XNmU{2PH5!OSg(sJG>CkPAR_{B6~of{Y) z!5TFGr~M3o9iyMpD9cn1q`Mjo#_4@>?DE{Bfpo?3a#9AJ_KU!7JT+3VZpXZ-N2nKPQD8`wrr}uu(zb|%XGA9=}h`sq=&fAQwEvu13DJ@Yo zsocWibTndf{IsRo@~-z^V_^KmT;Arfb59BJ_3*A@u$}NU_8^HX*o;mPMp+aNu^E4l z27CiB=X3NX^9Gtfuz6NJeVt_xnQjD!V?57eQI8S_3^YB?gEX?8#{NinWM*Z324eq8 zl2)cA@0&D*ug=P1;%OZs^%s||g`@ZPE%EbSVv}dOyZ))nlZ|(jxqIaK3<@`sm zm-a->k1Otr-9fBhK&*fNQGQ3HTCA@XOU%k_o-5d%^{bGbX^eP~|P zBgp@}m#l%eSo!H=Y4NUP0(bJB5q04GQuFN&evR9-Nz$z*8#%$%vqew2HcAPPQaoh; zRamCVn%0(WYd@}JY3S0{XNU`$`TjNmBsZt7xJ>$Y+`RxmB$hQW_9_g!lsk@c zxAJRRr0gyIe$2USXiC-u{i-hPOao_i#RB;LIFh=DSViveuj>|RjBikd;G=vL4t!5B zxKFEcj&7AHz=2Iu`vb~x_K0uJ84(d5B*;gE2i_ahdRK2Ua2^Di`gfSq8Y-42W%cX& zq2Bas^`8Nde Date: Thu, 18 Aug 2016 00:09:57 -0400 Subject: [PATCH 02/23] fixup --- code/__DEFINES/misc.dm | 6 ++++ code/__HELPERS/unsorted.dm | 45 ++++++++++++++++++++----- code/modules/mining/equipment_locker.dm | 2 +- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 7a585461657..ab1357a5833 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -165,6 +165,12 @@ #define MAX_STACK_SIZE 50 +//check_target_facings() return defines +#define FACING_FAILED 0 +#define FACING_SAME_DIR 1 +#define FACING_EACHOTHER 2 +#define FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR 3 //Do I win the most informative but also most stupid define award? + //unmagic-strings for types of polls #define POLLTYPE_OPTION "OPTION" #define POLLTYPE_TEXT "TEXT" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 6cd28a20a32..a51b593eb75 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1355,20 +1355,19 @@ Standard way to write links -Sayu return 1 -proc/check_target_facings(mob/living/initator, mob/living/target) +/proc/check_target_facings(mob/living/initator, mob/living/target) /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/ - if(!!isliving(target) || target.lying || istype(target, /mob/living/silicon/pai)) + if(!ismob(target) || target.lying) //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side - return - + return FACING_FAILED if(initator.dir == target.dir) //mobs are facing the same direction - return 1 - if(initator.dir + 4 == target.dir || initator.dir - 4 == target.dir) //mobs are facing each other - return 2 + return FACING_SAME_DIR + if(is_A_facing_B(initator, target) && is_A_facing_B(target, initator)) //mobs are facing each other + return FACING_EACHOTHER if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st - return 3 + return FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR atom/proc/GetTypeInAllContents(typepath) @@ -1472,6 +1471,36 @@ var/mob/dview/dview_mob = new return 1 return 0 + +//Get the dir to the RIGHT of dir if they were on a clock +//NORTH --> NORTHEAST +/proc/get_clockwise_dir(dir) + . = angle2dir(dir2angle(dir)+45) + +//Get the dir to the LEFT of dir if they were on a clock +//NORTH --> NORTHWEST +/proc/get_anticlockwise_dir(dir) + . = angle2dir(dir2angle(dir)-45) + + +//Compare A's dir, the clockwise dir of A and the anticlockwise dir of A +//To the opposite dir of the dir returned by get_dir(B,A) +//If one of them is a match, then A is facing B +/proc/is_A_facing_B(atom/A, atom/B) + if(!istype(A) || !istype(B)) + return 0 + if(isliving(A)) + var/mob/living/LA = A + if(LA.lying) + return 0 + var/goal_dir = angle2dir(dir2angle(get_dir(B,A)+180)) + var/clockwise_A_dir = get_clockwise_dir(A.dir) + var/anticlockwise_A_dir = get_anticlockwise_dir(B.dir) + + if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) + return 1 + return 0 + //This is just so you can stop an orbit. //orbit() can run without it (swap orbiting for A) //but then you can never stop it and that's just silly. diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index e4313b748b7..f73fa22c72e 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -1201,7 +1201,7 @@ marked_image = null var/backstab = check_target_facings(user, L) var/def_check = L.getarmor(type = "bomb") - if(backstab == 3 || backstab == 1) + if(backstab == FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR || backstab == FACING_SAME_DIR) L.apply_damage(80, BRUTE, blocked = def_check) playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong else From 21aa0c2aaba26c5d3bb2c15ebcc685a4ee02ea5b Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 18 Aug 2016 00:19:29 -0400 Subject: [PATCH 03/23] further tweaks/fixes --- code/game/gamemodes/miniantags/borer/borer.dm | 2 +- code/game/objects/items/weapons/twohanded.dm | 4 ++-- code/modules/mining/equipment_locker.dm | 2 +- code/modules/mob/living/silicon/robot/drone/drone.dm | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index cd7a95ea619..73694f9a5c2 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -76,7 +76,7 @@ attacktext = "nips" friendly = "prods" wander = 0 - mob_size = MOB_SIZE_SMALL + mob_size = MOB_SIZE_TINY density = 0 pass_flags = PASSTABLE ventcrawler = 2 diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 0c5e8140647..8e9424c4997 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -130,7 +130,7 @@ /obj/item/weapon/twohanded/required/mob_can_equip(M as mob, slot) if(wielded && !slot_flags) - to_chat(M, "[src.name] is too cumbersome to carry with anything but your hands!") + to_chat(M, "[src] is too cumbersome to carry with anything but your hands!") return 0 return ..() @@ -141,7 +141,7 @@ if(H != null) to_chat(user, "[src] is too cumbersome to carry in one hand!") return - if(src.loc != user) + if(loc != user) wield(user) ..() diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index f73fa22c72e..418a8dbde9a 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -1211,4 +1211,4 @@ if(!charged) charged = 1 icon_state = "mining_hammer1" - playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) \ No newline at end of file + playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 569b1a535fe..72fef576d73 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -16,7 +16,7 @@ local_transmit = 1 ventcrawler = 2 magpulse = 1 - mob_size = MOB_SIZE_SMALL + mob_size = MOB_SIZE_TINY // We need to keep track of a few module items so we don't need to do list operations // every time we need them. These get set in New() after the module is chosen. From 826cc21e2f8c5803a141b1209f82e94143b24900 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 18 Aug 2016 03:03:05 -0400 Subject: [PATCH 04/23] more styling --- code/__HELPERS/unsorted.dm | 2 +- code/modules/mob/inventory.dm | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index a51b593eb75..1e6aaa90a42 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1493,7 +1493,7 @@ var/mob/dview/dview_mob = new var/mob/living/LA = A if(LA.lying) return 0 - var/goal_dir = angle2dir(dir2angle(get_dir(B,A)+180)) + var/goal_dir = angle2dir(dir2angle(get_dir(B, A)+180)) var/clockwise_A_dir = get_clockwise_dir(A.dir) var/anticlockwise_A_dir = get_anticlockwise_dir(B.dir) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 7868c37c726..5d746603418 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -173,24 +173,24 @@ M.update_inv_r_hand(0) return 1 - if(M.s_active && M.s_active.can_be_inserted(src,1)) //if storage active insert there + if(M.s_active && M.s_active.can_be_inserted(src, 1)) //if storage active insert there M.s_active.handle_item_insertion(src) return 1 var/obj/item/weapon/storage/S = M.get_inactive_hand() - if(istype(S) && S.can_be_inserted(src,1)) //see if we have box in other hand + if(istype(S) && S.can_be_inserted(src, 1)) //see if we have box in other hand S.handle_item_insertion(src) return 1 S = M.get_item_by_slot(slot_belt) - if(istype(S) && S.can_be_inserted(src,1)) //else we put in belt + if(istype(S) && S.can_be_inserted(src, 1)) //else we put in belt S.handle_item_insertion(src) return 1 S = M.get_item_by_slot(slot_back) //else we put in backpack - if(istype(S) && S.can_be_inserted(src,1)) + if(istype(S) && S.can_be_inserted(src, 1)) S.handle_item_insertion(src) - playsound(src.loc, "rustle", 50, 1, -5) + playsound(loc, "rustle", 50, 1, -5) return 1 to_chat(M, "You are unable to equip that!") From 4c4a7b4428ebaec8c65ae65fde6ba28c696d88f4 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 18 Aug 2016 03:05:16 -0400 Subject: [PATCH 05/23] no pooling --- code/modules/mining/equipment_locker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 418a8dbde9a..c71c333258b 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -1193,7 +1193,7 @@ return if(proximity_flag && target == mark && isliving(target)) var/mob/living/L = target - PoolOrNew(/obj/effect/overlay/temp/kinetic_blast, get_turf(L)) + new /obj/effect/overlay/temp/kinetic_blast(get_turf(L)) mark = 0 if(L.mob_size >= MOB_SIZE_LARGE) L.underlays -= marked_image From bc95f90c9743549896e1459b8ba3a9c3258fbdc2 Mon Sep 17 00:00:00 2001 From: IcyV Date: Thu, 18 Aug 2016 02:53:48 -0700 Subject: [PATCH 06/23] Adds more graffiti ![Graffiti](http://puu.sh/qFA5C/e2d8115881.png) Sprites courtesy of FullOfSkittles :cl: IcyV add: Adds in an amount of new graffiti /:cl: --- code/game/objects/items/crayons.dm | 8 ++++---- icons/effects/crayondecal.dmi | Bin 16244 -> 22035 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 9f0388bc8cd..9c03d164bb2 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -12,7 +12,7 @@ attack_verb = list("attacked", "coloured") var/colour = "#FF0000" //RGB var/drawtype = "rune" - var/list/graffiti = list("body","amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","up","down","left","right","heart","borgsrogue","voxpox","shitcurity","catbeast","hieroglyphs1","hieroglyphs2","hieroglyphs3","security","syndicate1","syndicate2","nanotrasen","lie","valid") + var/list/graffiti = list("body","amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","up","down","left","right","heart","borgsrogue","voxpox","shitcurity","catbeast","hieroglyphs1","hieroglyphs2","hieroglyphs3","security","syndicate1","syndicate2","nanotrasen","lie","valid","arrowleft","arrowright","arrowup","arrowdown","chicken","hailcrab","brokenheart","peace","scribble","scribble2","scribble3","skrek","squish","tunnelsnake","yip","youaredead") var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") var/uses = 30 //0 for unlimited uses var/instant = 0 @@ -92,19 +92,19 @@ if(uses) uses-- if(!uses) - to_chat(user, "You used up your [src.name]!") + to_chat(user, "You used up your [name]!") qdel(src) return /obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob) var/huffable = istype(src,/obj/item/toy/crayon/spraycan) if(M == user) - to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [src.name]. Delicious!") + to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!") user.nutrition += 5 if(uses) uses -= 5 if(uses <= 0) - to_chat(user, "There is no more of [src.name] left!") + to_chat(user, "There is no more of [name] left!") qdel(src) else ..() diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index 47d670d5149aa0f2c07b8f57403fdd33825919d0..6803da59da8aea506fa78c820136309ac96fce44 100644 GIT binary patch literal 22035 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

~iyCOrHIkB!oP71UM|ZtT6+PRR#ruOM(qv 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 jUTkccPy+x9I|yJ~nJNRS_mUOTKLEK8%I_ Date: Thu, 18 Aug 2016 14:54:13 -0400 Subject: [PATCH 07/23] Minor genetic instability refactor & minor genetics rebalance --- code/__DEFINES/genetics.dm | 4 ++++ code/game/dna/genes/gene.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 20 ++++++++++---------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 97f797b2718..3828392f99e 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -107,3 +107,7 @@ #define GENE_INSTABILITY_MINOR 5 #define GENE_INSTABILITY_MODERATE 10 #define GENE_INSTABILITY_MAJOR 15 + +#define GENETIC_DAMAGE_STAGE_1 80 +#define GENETIC_DAMAGE_STAGE_2 65 +#define GENETIC_DAMAGE_STAGE_3 35 diff --git a/code/game/dna/genes/gene.dm b/code/game/dna/genes/gene.dm index a3781f9985d..f74d0c7d2a0 100644 --- a/code/game/dna/genes/gene.dm +++ b/code/game/dna/genes/gene.dm @@ -100,7 +100,7 @@ var/mutation=0 // Activation probability - var/activation_prob=45 + var/activation_prob=100 // Possible activation messages var/list/activation_messages=list() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 8951b21bc74..a7e451bcc7e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -176,22 +176,22 @@ if(gene.is_active(src)) speech_problem_flag = 1 gene.OnMobLife(src) - if(gene_stability < 85) + if(gene_stability < GENETIC_DAMAGE_STAGE_1) var/instability = DEFAULT_GENE_STABILITY - gene_stability - if(prob(instability / 10)) - adjustFireLoss(min(6, instability / 12)) + if(prob(instability * 0.1)) + adjustFireLoss(min(5, instability * 0.67)) to_chat(src, "You feel like your skin is burning and bubbling off!") - if(gene_stability < 70) - if(prob(instability / 12)) - adjustCloneLoss(min(5, instability / 15)) + if(gene_stability < GENETIC_DAMAGE_STAGE_2) + if(prob(instability * 0.83)) + adjustCloneLoss(min(4, instability * 0.05)) to_chat(src, "You feel as if your body is warping.") - if(prob(instability / 10)) - adjustToxLoss(min(6, instability / 12)) + if(prob(instability * 0.1)) + adjustToxLoss(min(5, instability * 0.67)) to_chat(src, "You feel weak and nauseous.") - if(gene_stability < 40 && prob(1)) + if(gene_stability < GENETIC_DAMAGE_STAGE_3 && prob(1)) to_chat(src, "You feel incredibly sick... Something isn't right!") spawn(300) - if(gene_stability < 40) + if(gene_stability < GENETIC_DAMAGE_STAGE_3) gib() if(!(species.flags & RADIMMUNE)) From 80ad643ddc5bfccdb84ecdd23df4b8010ed663c4 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Thu, 18 Aug 2016 17:08:36 -0400 Subject: [PATCH 08/23] Robotic Limb Repair now consumes cables Repairing burn damage on a robotic limb / IPC now consumes cables in the process. The heal ratio is 3 burn damage per length of cable. Repairing will cap at 15 damage (5 cables) per use, which is the amount that was previously healed with every use. If you have less than 15 damage, it will use the number of cables necessary to fully repair the damage. If you have fewer than 5 cables, it will attempt to repair as much damage as possible with the amount provided. A full cable coil (30 lengths) will now heal a total of 90 burn damage, instead of being an infinite healing source as long as you have at least one piece. This makes cable coils more comparable to the advanced burn kits in medical for organic patients, which have only 6 uses that always heal 25 damage. Technically a balance PR, but also can be considered an exploit fix since robotic limbs literally had pocket-sized infinite healing sources readily available across maint while organic limbs didn't have that luxury. --- code/modules/power/cable.dm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index d2d2c619882..5dbc7ee74ce 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -517,7 +517,19 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(S.burn_dam) if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP) - S.heal_damage(0,15,0,1) + if(S.burn_dam >= 15 && amount >= 5) + S.heal_damage(0, 15, 0, 1) + use(5) + else + var/cable_to_use = 0 + var/dam_left = S.burn_dam + while(dam_left > 0) + cable_to_use += 1 + dam_left -= 3 + if(cable_to_use >= amount) //make sure we don't use more cable than we have + cable_to_use = amount //in case we have a lot of damage but not a lot of cable + use(cable_to_use) + S.heal_damage(0, (cable_to_use * 3), 0, 1) user.visible_message("\The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].") else if(S.open != 2) to_chat(user, "The damage is far too severe to patch over externally.") From a586d3218cbce45fd4a6a1e0344e2d7feddd4693 Mon Sep 17 00:00:00 2001 From: IcyV Date: Thu, 18 Aug 2016 14:45:34 -0700 Subject: [PATCH 09/23] Fixes other crayon decals. Most other crayon drawings were stuck with being only black with how they were done. This lets them be any color. --- icons/effects/crayondecal.dmi | Bin 22035 -> 21967 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index 6803da59da8aea506fa78c820136309ac96fce44..48388c18fd403a60db0a823d7a49fe7105805a26 100644 GIT binary patch literal 21967 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

~iyCOrHIkB!oP71UM|ZtT6+PRR#ruOM(qv zREY7StCKdrehV4%<-UgGYD8vq$^A%fnLcl^EYoN?J`_&Ba<@qHHF)Q8QR$^0hAm9{ z+(YCEe!uW(#~X|Uv|>r--(zH@H766ZZYY`v5$~A=U~Wa|zvR~1KwUW?Xdnp9-90>D z5YecTqDpF>-Ul`A&&LQ_QEl=35r(cLoh8^j*bst-Zp@c2N!y*h+aBazd!?SZP5_%6 zBb;mCfXZ~+`PL6L-j~dT2o6;m`f!LS%|2u&fy++-uM2(R=F9{_nj{XWWr$YujqQet zIkq%uRhlX*R9N{w45~;gKr`8HjBr1+f1hlJ4WHQu!XVk(dLr$DOezX}r#pT=9Ks(Z zT8y|gay5)X`-1L_dWB@2Df^_LnjgAdF1QCyw;s>3GrIEO=7upN8IyTt=V!Qf zS2q=~T#j49xEovQ6$!wN0>|^owY{QW9$*qAi!0v`PT(v;ojWnNS5ku8rxy4W#G;KqJXBxJf>^ zkpqTqHLeZ?YLdQH`@zB71!nh#4n%Kb-hznQ!Huv4j%ET3BVNd~+T07w{U=61D36@@doc~**C42ZI^esHM$pN60~HN{C8sh^J{g{vv!j}QfuS{#@1&%7dn*Z! zd!yr3p%Ux3e|HLPuh+C+NjK7I=0F3pcSAhwMneEPpOhEetOOmYh$eQlewBqQ)BoD( zfQygUU7a66X4iAPjZ@aHsk9Tt< z`M=X;>4?;W5aXUa$;R`%%eR+Y{obMtV1qUHND1Qo>ztqp>X(A= z#&shLY>1@Fd!_IZ-jbRjmN| ze%D)z;v0Fn0mwdcY%6z21|`b}3v}haixLg%CuP#^wC}`2wrxwvQ&XO(reNs+7eKMkCE~<9Ck6t?mcf z+-O&9R5#mflMXWtmo}}NFO55Zx#Xz1+fsH~Y@f=eC(1$)UMyO3Qrd<-NpCB35=Lxg zgJkp(2$1j^wqFH*P?t84+k#J9h8Qec>dBJ0bFO`vMM<;LK>F^mKV9S^knka z9(7KKK+y8zb#fQDCm{6+hL?z2}#J9IU5%u9FYWuqk+5 zS$658Cih;F-Jzks2bgI43uu~DW6b+;-=qzW6||BJijt|BJcd$0qz<8P33@zP2WIR& zvyA+on%E&j2NsKMARBJ>!`#lKWBgGAbFG7J;nA?@1}&RYB&2JJFaaAm$Nqw4(Z!C#VL7hsE_MM z;EnZNvA+;^#%V9^LfmOh+xM1b2qUZk@ z`K3w0qCbz;4Ha}H2<~(ULZ+iE4SxYvt@}S=T;8pR$C~yvhwHD6SRE4mp zB?pQZ4xgjMJP3A3JTF|-v5u+YQ#R{=m4CYffg2K#XH9X^~yR_MJ zy1Zz&E6nikPj^BU$=nZ2{!(0VrH`T>Gak6e(yeQ*fu)SH=0Qw?WMibwq)uM$*@FFu zwK)@SU%!`LN{p>y Date: Thu, 18 Aug 2016 20:54:37 -0400 Subject: [PATCH 10/23] Slap Emote Fix --- code/modules/mob/living/carbon/human/emote.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index d677d630479..9b2026951c1 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -756,10 +756,10 @@ M = A break if(M) - message = "[src] slaps [M] across the face. Ouch!" + message = "[src] slaps [M] across the face. Ouch!" playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) else - message = "[src] slaps \himself!" + message = "[src] slaps \himself!" playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) src.adjustFireLoss(4) From 1b45831b77ff7e3e80828b492417dee108587d14 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Fri, 19 Aug 2016 01:06:52 -0400 Subject: [PATCH 11/23] Fixes Animal Attack Text --- code/modules/mob/living/carbon/human/human.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 48111b46d8a..857ff6b2de2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -404,13 +404,12 @@ if(M.melee_damage_upper == 0) M.custom_emote(1, "[M.friendly] [src]") else - M.do_attack_animation(src) if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) - for(var/mob/O in viewers(src, null)) - O.show_message("[M] [M.attacktext] [src]!", 1) - M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])") - src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") + M.do_attack_animation(src) + visible_message("[M] [M.attacktext] [src]!", \ + "[M] [M.attacktext] [src]!") + add_logs(src, M, "attacked") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK, M.armour_penetration)) return 0 From c93b32e2bad6e83c02926e9cb2c0f902be2b66be Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Aug 2016 07:10:18 -0400 Subject: [PATCH 12/23] Automatic changelog generation for PR #5483 --- html/changelogs/AutoChangeLog-pr-5483.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5483.yml diff --git a/html/changelogs/AutoChangeLog-pr-5483.yml b/html/changelogs/AutoChangeLog-pr-5483.yml new file mode 100644 index 00000000000..741bcaf6589 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5483.yml @@ -0,0 +1,5 @@ +author: IcyV +delete-after: True +changes: + - rscadd: "Adds in an amount of new graffiti" + - bugfix: "Fixes the issue of other graffiti only being able to be done in black." From 3cc9b9d4248e62fc97b27faf2e57ba640c5b5cd4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Aug 2016 18:03:11 -0400 Subject: [PATCH 13/23] Automatic changelog generation for PR #5493 --- html/changelogs/AutoChangeLog-pr-5493.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5493.yml diff --git a/html/changelogs/AutoChangeLog-pr-5493.yml b/html/changelogs/AutoChangeLog-pr-5493.yml new file mode 100644 index 00000000000..88b8031d3c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5493.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes slap emote text being the wrong partial color" From 2e9cd28ad7534ca7df1f371220425446b3efcb2b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Aug 2016 18:09:06 -0400 Subject: [PATCH 14/23] Automatic changelog generation for PR #5497 --- html/changelogs/AutoChangeLog-pr-5497.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5497.yml diff --git a/html/changelogs/AutoChangeLog-pr-5497.yml b/html/changelogs/AutoChangeLog-pr-5497.yml new file mode 100644 index 00000000000..3b81863ec35 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5497.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - bugfix: "Fixes the attack text of simple animals attacking human mobs" From fbf51ed4bb697c4440d157d7820d1e47aace048a Mon Sep 17 00:00:00 2001 From: TheDZD Date: Fri, 19 Aug 2016 18:14:15 -0400 Subject: [PATCH 15/23] Increases activation chances for rarer powers --- code/game/dna/genes/goon_powers.dm | 4 ++-- code/game/dna/genes/powers.dm | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 394540c7762..f9e9c2678a5 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -47,7 +47,7 @@ desc = "Enables the subject to bend low levels of light around themselves, creating a cloaking effect." activation_messages = list("You begin to fade into the shadows.") deactivation_messages = list("You become fully visible.") - activation_prob=10 + activation_prob=25 mutation = CLOAK /datum/dna/gene/basic/stealth/darkcloak/New() @@ -74,7 +74,7 @@ desc = "The subject becomes able to subtly alter light patterns to become invisible, as long as they remain still." activation_messages = list("You feel one with your surroundings.") deactivation_messages = list("You feel oddly visible.") - activation_prob=10 + activation_prob=25 mutation = CHAMELEON /datum/dna/gene/basic/stealth/chameleon/New() diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm index 465dc5df685..9bc3aa974e6 100644 --- a/code/game/dna/genes/powers.dm +++ b/code/game/dna/genes/powers.dm @@ -8,7 +8,7 @@ deactivation_messages=list("You feel the need to breathe, once more.") instability = GENE_INSTABILITY_MODERATE mutation=NO_BREATH - activation_prob=10 + activation_prob=25 /datum/dna/gene/basic/nobreath/New() block=NOBREATHBLOCK @@ -116,7 +116,7 @@ deactivation_messages=list("Your muscles shrink.") instability = GENE_INSTABILITY_MAJOR mutation=HULK - activation_prob=5 + activation_prob=15 /datum/dna/gene/basic/hulk/New() block=HULKBLOCK @@ -156,7 +156,7 @@ deactivation_messages=list("the walls around you re-appear.") instability = GENE_INSTABILITY_MAJOR mutation=XRAY - activation_prob=10 + activation_prob=15 /datum/dna/gene/basic/xray/New() block=XRAYBLOCK @@ -167,7 +167,7 @@ deactivation_messages = list("You feel dumber.") instability = GENE_INSTABILITY_MAJOR mutation=TK - activation_prob=10 + activation_prob=15 /datum/dna/gene/basic/tk/New() block=TELEBLOCK From 98989aa19c195c27611cb99fb9bbe5dc2095c185 Mon Sep 17 00:00:00 2001 From: Krausus Date: Fri, 19 Aug 2016 19:58:32 -0400 Subject: [PATCH 16/23] SQL sanitization fixes - Completely removes sql_sanitize_text - Fixes inconsistent encoding of flavor and records texts - Adds some extra sanity checking to sanitizeSQL --- code/__HELPERS/sanitize_values.dm | 15 ----- code/__HELPERS/text.dm | 4 ++ code/modules/admin/DB ban/functions.dm | 10 ++-- code/modules/admin/banappearance.dm | 15 ----- code/modules/client/client procs.dm | 16 +++-- code/modules/client/preference/preferences.dm | 7 +-- .../client/preference/preferences_mysql.dm | 59 +++++++++++++------ code/modules/mob/living/silicon/silicon.dm | 2 +- code/modules/research/message_server.dm | 14 ++--- 9 files changed, 65 insertions(+), 77 deletions(-) diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 5020693a499..6777f43ff91 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -50,18 +50,3 @@ HSL[3] = min(HSL[3],0.4) var/list/RGB = hsl2rgb(arglist(HSL)) return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]" - - -// Sanitize inputs to avoid SQL injection attacks -/proc/sql_sanitize_text(var/text) - text = replacetext(text, "'", "''") - text = replacetext(text, ";", "") - text = replacetext(text, "&", "") - return text - -// Calls the above proc on each entry of a list to ensure its entries are clean -/proc/sql_sanitize_text_list(var/list/l) - var/list/new_list = l.Copy() - for(var/text in new_list) - sql_sanitize_text(text) - return new_list \ No newline at end of file diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index e56ed3a4310..40eaa9007a1 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -15,6 +15,10 @@ // Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts. /proc/sanitizeSQL(var/t as text) + if(isnull(t)) + return null + if(!istext(t)) + t = "[t]" // Just quietly assume any non-texts are supposed to be text var/sqltext = dbcon.Quote(t); return copytext(sqltext, 2, lentext(sqltext));//Quote() adds quotes around input, we already do that diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index 3027864ace6..c22a019addb 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -113,7 +113,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = else adminwho += ", [C]" - reason = sql_sanitize_text(reason) + reason = sanitizeSQL(reason) if(maxadminbancheck) var/DBQuery/adm_query = dbcon.NewQuery("SELECT count(id) AS num FROM [format_table_name("ban")] WHERE (a_ckey = '[a_ckey]') AND (bantype = 'ADMIN_PERMABAN' OR (bantype = 'ADMIN_TEMPBAN' AND expiration_time > Now())) AND isnull(unbanned)") @@ -244,14 +244,14 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null) to_chat(usr, "Invalid ban id. Contact the database admin") return - reason = sql_sanitize_text(reason) + reason = sanitizeSQL(reason) var/value switch(param) if("reason") if(!value) value = input("Insert the new reason for [pckey]'s ban", "New Reason", "[reason]", null) as null|text - value = sql_sanitize_text(value) + value = sanitizeSQL(value) if(!value) to_chat(usr, "Cancelled") return @@ -417,8 +417,8 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) adminckey = ckey(adminckey) playerckey = ckey(playerckey) - playerip = sql_sanitize_text(playerip) - playercid = sql_sanitize_text(playercid) + playerip = sanitizeSQL(playerip) + playercid = sanitizeSQL(playercid) if(adminckey || playerckey || playerip || playercid || dbbantype) diff --git a/code/modules/admin/banappearance.dm b/code/modules/admin/banappearance.dm index b039f6bd634..06deaa1c461 100644 --- a/code/modules/admin/banappearance.dm +++ b/code/modules/admin/banappearance.dm @@ -92,18 +92,3 @@ DEBUG appearance_savebanfile() return 1 return 0 - -/* -proc/DB_ban_isappearancebanned(var/playerckey) - establish_db_connection() - if(!dbcon.IsConnected()) - return - - var/sqlplayerckey = sql_sanitize_text(ckey(playerckey)) - - var/DBQuery/query = dbcon.NewQuery("SELECT id FROM [format_table_name("ban")] WHERE CKEY = '[sqlplayerckey]' AND ((bantype = 'APPEARANCE_BAN') OR (bantype = 'APPEARANCE_TEMPBAN' AND expiration_time > Now())) AND unbanned != 1") - query.Execute() - while(query.NextRow()) - return 1 - return 0 -*/ \ No newline at end of file diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 7a87264d815..ed4e648e6d0 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -368,9 +368,7 @@ if(!dbcon.IsConnected()) return - var/sql_ckey = sql_sanitize_text(src.ckey) - - var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM [format_table_name("player")] WHERE ckey = '[sql_ckey]'") + var/DBQuery/query = dbcon.NewQuery("SELECT id, datediff(Now(),firstseen) as age FROM [format_table_name("player")] WHERE ckey = '[ckey]'") query.Execute() var/sql_id = 0 player_age = 0 // New players won't have an entry so knowing we have a connection we set this to zero to be updated if their is a record. @@ -397,7 +395,7 @@ if(related_accounts_cid.len) log_access("Alts: [key_name(src)]:[jointext(related_accounts_cid, " - ")]") - var/watchreason = check_watchlist(sql_ckey) + var/watchreason = check_watchlist(ckey) if(watchreason) message_admins("Notice: [key_name_admin(src)] is on the watchlist and has just connected - Reason: [watchreason]") send2adminirc("Watchlist - [key_name(src)] is on the watchlist and has just connected - Reason: [watchreason]") @@ -413,9 +411,9 @@ if(src.holder) admin_rank = src.holder.rank - var/sql_ip = sql_sanitize_text(src.address) - var/sql_computerid = sql_sanitize_text(src.computer_id) - var/sql_admin_rank = sql_sanitize_text(admin_rank) + var/sql_ip = sanitizeSQL(address) + var/sql_computerid = sanitizeSQL(computer_id) + var/sql_admin_rank = sanitizeSQL(admin_rank) if(sql_id) @@ -424,12 +422,12 @@ query_update.Execute() else //New player!! Need to insert all the stuff - var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[sql_ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')") + var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("player")] (id, ckey, firstseen, lastseen, ip, computerid, lastadminrank) VALUES (null, '[ckey]', Now(), Now(), '[sql_ip]', '[sql_computerid]', '[sql_admin_rank]')") query_insert.Execute() //Logging player access var/serverip = "[world.internet_address]:[world.port]" - var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[sql_ckey]','[sql_ip]','[sql_computerid]');") + var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[ckey]','[sql_ip]','[sql_computerid]');") query_accesslog.Execute() diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 635169bf89b..c39a34d969a 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -1755,12 +1755,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts if("be_special") var/r = href_list["role"] - if(!(r in special_roles)) - var/cleaned_r = sql_sanitize_text(r) - if(r != cleaned_r) // up to no good - message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]") - to_chat(user, "Stop right there, criminal scum") - else + if(r in special_roles) be_special ^= r if("name") diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm index f72ac076dff..dbdc97d11e1 100644 --- a/code/modules/client/preference/preferences_mysql.dm +++ b/code/modules/client/preference/preferences_mysql.dm @@ -70,7 +70,7 @@ UI_style='[UI_style]', UI_style_color='[UI_style_color]', UI_style_alpha='[UI_style_alpha]', - be_role='[list2params(sql_sanitize_text_list(be_special))]', + be_role='[sanitizeSQL(list2params(be_special))]', default_slot='[default_slot]', toggles='[toggles]', sound='[sound]', @@ -227,6 +227,15 @@ med_record = query.item[49] sec_record = query.item[50] gen_record = query.item[51] + // Apparently, the preceding vars weren't always encoded properly... + if(findtext(flavor_text, "<")) // ... so let's clumsily check for tags! + flavor_text = html_encode(flavor_text) + if(findtext(med_record, "<")) + med_record = html_encode(med_record) + if(findtext(sec_record, "<")) + sec_record = html_encode(sec_record) + if(findtext(gen_record, "<")) + gen_record = html_encode(gen_record) disabilities = text2num(query.item[52]) player_alt_titles = params2list(query.item[53]) organ_data = params2list(query.item[54]) @@ -322,13 +331,13 @@ firstquery.Execute() while(firstquery.NextRow()) if(text2num(firstquery.item[1]) == default_slot) - var/DBQuery/query = dbcon.NewQuery({"UPDATE [format_table_name("characters")] SET OOC_Notes='[sql_sanitize_text(metadata)]', - real_name='[sql_sanitize_text(real_name)]', + var/DBQuery/query = dbcon.NewQuery({"UPDATE [format_table_name("characters")] SET OOC_Notes='[sanitizeSQL(metadata)]', + real_name='[sanitizeSQL(real_name)]', name_is_always_random='[be_random_name]', gender='[gender]', age='[age]', - species='[sql_sanitize_text(species)]', - language='[sql_sanitize_text(language)]', + species='[sanitizeSQL(species)]', + language='[sanitizeSQL(language)]', hair_red='[r_hair]', hair_green='[g_hair]', hair_blue='[b_hair]', @@ -345,10 +354,10 @@ head_accessory_red='[r_headacc]', head_accessory_green='[g_headacc]', head_accessory_blue='[b_headacc]', - hair_style_name='[sql_sanitize_text(h_style)]', - facial_style_name='[sql_sanitize_text(f_style)]', - marking_style_name='[sql_sanitize_text(m_style)]', - head_accessory_style_name='[sql_sanitize_text(ha_style)]', + hair_style_name='[sanitizeSQL(h_style)]', + facial_style_name='[sanitizeSQL(f_style)]', + marking_style_name='[sanitizeSQL(m_style)]', + head_accessory_style_name='[sanitizeSQL(ha_style)]', eyes_red='[r_eyes]', eyes_green='[g_eyes]', eyes_blue='[b_eyes]', @@ -369,10 +378,10 @@ job_karma_high='[job_karma_high]', job_karma_med='[job_karma_med]', job_karma_low='[job_karma_low]', - flavor_text='[sql_sanitize_text(html_decode(flavor_text))]', - med_record='[sql_sanitize_text(html_decode(med_record))]', - sec_record='[sql_sanitize_text(html_decode(sec_record))]', - gen_record='[sql_sanitize_text(html_decode(gen_record))]', + flavor_text='[sanitizeSQL(flavor_text)]', + med_record='[sanitizeSQL(med_record)]', + sec_record='[sanitizeSQL(sec_record)]', + gen_record='[sanitizeSQL(gen_record)]', player_alt_titles='[playertitlelist]', disabilities='[disabilities]', organ_data='[organlist]', @@ -401,7 +410,10 @@ skin_tone, skin_red, skin_green, skin_blue, markings_red, markings_green, markings_blue, head_accessory_red, head_accessory_green, head_accessory_blue, - hair_style_name, facial_style_name, marking_style_name, head_accessory_style_name, + hair_style_name, + facial_style_name, + marking_style_name, + head_accessory_style_name, eyes_red, eyes_green, eyes_blue, underwear, undershirt, backbag, b_type, alternate_option, @@ -409,20 +421,26 @@ job_medsci_high, job_medsci_med, job_medsci_low, job_engsec_high, job_engsec_med, job_engsec_low, job_karma_high, job_karma_med, job_karma_low, - flavor_text, med_record, sec_record, gen_record, + flavor_text, + med_record, + sec_record, + gen_record, player_alt_titles, disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks, body_accessory, gear) VALUES - ('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]', - '[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(language)]', + ('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]', + '[age]', '[sanitizeSQL(species)]', '[sanitizeSQL(language)]', '[r_hair]', '[g_hair]', '[b_hair]', '[r_facial]', '[g_facial]', '[b_facial]', '[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]', '[r_markings]', '[g_markings]', '[b_markings]', '[r_headacc]', '[g_headacc]', '[b_headacc]', - '[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[sql_sanitize_text(m_style)]', '[sql_sanitize_text(ha_style)]', + '[sanitizeSQL(h_style)]', + '[sanitizeSQL(f_style)]', + '[sanitizeSQL(m_style)]', + '[sanitizeSQL(ha_style)]', '[r_eyes]', '[g_eyes]', '[b_eyes]', '[underwear]', '[undershirt]', '[backbag]', '[b_type]', '[alternate_option]', @@ -430,7 +448,10 @@ '[job_medsci_high]', '[job_medsci_med]', '[job_medsci_low]', '[job_engsec_high]', '[job_engsec_med]', '[job_engsec_low]', '[job_karma_high]', '[job_karma_med]', '[job_karma_low]', - '[sql_sanitize_text(html_encode(flavor_text))]', '[sql_sanitize_text(html_encode(med_record))]', '[sql_sanitize_text(html_encode(sec_record))]', '[sql_sanitize_text(html_encode(gen_record))]', + '[sanitizeSQL(flavor_text)]', + '[sanitizeSQL(med_record)]', + '[sanitizeSQL(sec_record)]', + '[sanitizeSQL(gen_record)]', '[playertitlelist]', '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]', '[socks]', '[body_accessory]', '[gearlist]') diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 5dd9ea3b09e..65c5c54b57b 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -242,7 +242,7 @@ set desc = "Sets an extended description of your character's features." set category = "IC" - flavor_text = sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text) + update_flavor_text() /mob/living/silicon/binarycheck() return 1 diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 651f278cdd8..815f6d1fe58 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -315,7 +315,7 @@ var/obj/machinery/blackbox_recorder/blackbox proc/feedback_set(var/variable,var/value) if(!blackbox) return - variable = sql_sanitize_text(variable) + variable = sanitizeSQL(variable) var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) @@ -326,7 +326,7 @@ proc/feedback_set(var/variable,var/value) proc/feedback_inc(var/variable,var/value) if(!blackbox) return - variable = sql_sanitize_text(variable) + variable = sanitizeSQL(variable) var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) @@ -337,7 +337,7 @@ proc/feedback_inc(var/variable,var/value) proc/feedback_dec(var/variable,var/value) if(!blackbox) return - variable = sql_sanitize_text(variable) + variable = sanitizeSQL(variable) var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) @@ -348,8 +348,8 @@ proc/feedback_dec(var/variable,var/value) proc/feedback_set_details(var/variable,var/details) if(!blackbox) return - variable = sql_sanitize_text(variable) - details = sql_sanitize_text(details) + variable = sanitizeSQL(variable) + details = sanitizeSQL(details) var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) @@ -360,8 +360,8 @@ proc/feedback_set_details(var/variable,var/details) proc/feedback_add_details(var/variable,var/details) if(!blackbox) return - variable = sql_sanitize_text(variable) - details = sql_sanitize_text(details) + variable = sanitizeSQL(variable) + details = sanitizeSQL(details) var/datum/feedback_variable/FV = blackbox.find_feedback_datum(variable) From eac5ae96594da588f481cf2c2078da4fc7b276d2 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Aug 2016 20:11:30 -0400 Subject: [PATCH 17/23] Automatic changelog generation for PR #5482 --- html/changelogs/AutoChangeLog-pr-5482.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5482.yml diff --git a/html/changelogs/AutoChangeLog-pr-5482.yml b/html/changelogs/AutoChangeLog-pr-5482.yml new file mode 100644 index 00000000000..0ee25b4194e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5482.yml @@ -0,0 +1,4 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Adds in the Kinetic Smasher as a mining purchase" From c645076db3edf1d372b33c5bd3a2b8f4889e9970 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Aug 2016 20:11:47 -0400 Subject: [PATCH 18/23] Automatic changelog generation for PR #5486 --- html/changelogs/AutoChangeLog-pr-5486.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5486.yml diff --git a/html/changelogs/AutoChangeLog-pr-5486.yml b/html/changelogs/AutoChangeLog-pr-5486.yml new file mode 100644 index 00000000000..7558387ce4d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5486.yml @@ -0,0 +1,7 @@ +author: TheDZD +delete-after: True +changes: + - tweak: "Lowered genetic instability damage thresholds by 5 across the board. Effectively meaning that you can have one additional minor power without shifting into the next threshold." + - tweak: "Lowered the rate at which damage scales with instability, and the decreased upper cap on each damage type." + - tweak: "The base activation probability for powers is now 100%, rather than 45%. Abilities affected include everything except Cloak of Darkness, Chameleon, No Breathing, Hulk, Telekinesis, and X-Ray Vision, which all have their own independent activation chances (varying from 5% to 10%)." + - tweak: "Increases activation chances of TK (10% to 15%), No Breathing (10% to 25%), Cloak of Darkness (10% to 25%), Hulk (5% to 15%), X-Ray Vision (10% to 15%), and Chameleon (10% to 25%)." From d670aa46177a13ed88bdfc548b1aeda099ee0993 Mon Sep 17 00:00:00 2001 From: Krausus Date: Fri, 19 Aug 2016 20:34:44 -0400 Subject: [PATCH 19/23] Adds sanitization to custom item queries --- code/modules/customitems/item_spawning.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index 345bf6e164e..11df4b13cf9 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -3,7 +3,7 @@ return // Grab the info we want. - var/DBQuery/query = dbcon.NewQuery("SELECT cuiPath, cuiPropAdjust, cuiJobMask, cuiDescription, cuiItemName FROM [format_table_name("customuseritems")] WHERE cuiCKey='[M.ckey]' AND (cuiRealName='[M.real_name]' OR cuiRealName='*')") + var/DBQuery/query = dbcon.NewQuery("SELECT cuiPath, cuiPropAdjust, cuiJobMask, cuiDescription, cuiItemName FROM [format_table_name("customuseritems")] WHERE cuiCKey='[M.ckey]' AND (cuiRealName='[sanitizeSQL(M.real_name)]' OR cuiRealName='*')") query.Execute() while(query.NextRow()) From 9905896a43f15e08d048c55bd01b50128b639670 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Aug 2016 20:47:46 -0400 Subject: [PATCH 20/23] Automatic changelog generation for PR #5500 --- html/changelogs/AutoChangeLog-pr-5500.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5500.yml diff --git a/html/changelogs/AutoChangeLog-pr-5500.yml b/html/changelogs/AutoChangeLog-pr-5500.yml new file mode 100644 index 00000000000..b516c79cd1e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5500.yml @@ -0,0 +1,4 @@ +author: Krausus +delete-after: True +changes: + - bugfix: "Flavor text and records are no longer horrifically butchered when saved in the database." From e939f6b5911b5a990110359b2676e1e7ad5f0a4e Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Fri, 19 Aug 2016 21:34:39 -0400 Subject: [PATCH 21/23] Delays and Welder Repair Tweaks Welders now consume 1 fuel to heal 15 points of brute damage when repairing robotic limbs / IPCs Welders must now be ON to repair robotic limbs / IPCs (seriously, who dropped the ball on this one?) Welders and Cable Coils now incur a 1 second delay when being used to self-repair robotic limbs / IPCs - This is HALF the delay organics have to suffer when using trauma kits, and rather easy to not even notice. --- code/game/objects/items/weapons/tools.dm | 16 ++++++++++++---- code/modules/power/cable.dm | 22 +++++++++------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 1452273573a..176108b8f08 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -241,12 +241,20 @@ if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2) return ..() + if(!isOn()) //why wasn't this being checked already? + to_chat(user, "Turn on [src] before attempting repairs!") + return 1 + if(S.brute_dam) if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP) - if(remove_fuel(0,null)) - playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) - S.heal_damage(15,0,0,1) - user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") + if(get_fuel() >= 1) + if(H == user) + if(!do_mob(user, H, 10)) + return 1 + if(remove_fuel(1,null)) + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + S.heal_damage(15,0,0,1) + user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") else if(S.open != 2) to_chat(user, "Need more welding fuel!") return 1 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 5dbc7ee74ce..0bbc04c08d8 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -517,19 +517,15 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(S.burn_dam) if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP) - if(S.burn_dam >= 15 && amount >= 5) - S.heal_damage(0, 15, 0, 1) - use(5) - else - var/cable_to_use = 0 - var/dam_left = S.burn_dam - while(dam_left > 0) - cable_to_use += 1 - dam_left -= 3 - if(cable_to_use >= amount) //make sure we don't use more cable than we have - cable_to_use = amount //in case we have a lot of damage but not a lot of cable - use(cable_to_use) - S.heal_damage(0, (cable_to_use * 3), 0, 1) + if(H == user) + if(!do_mob(user, H, 10)) + return 1 + var/cable_to_use = 0 + for(cable_to_use in 1 to 5) + if(cable_to_use == amount || (cable_to_use * 3) >= S.burn_dam) + break + use(cable_to_use) + S.heal_damage(0, (cable_to_use * 3), 0, 1) user.visible_message("\The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].") else if(S.open != 2) to_chat(user, "The damage is far too severe to patch over externally.") From 70047a2b2abe8deca5295a815bd74c67e6ed9c97 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Aug 2016 21:56:19 -0400 Subject: [PATCH 22/23] Automatic changelog generation for PR #5490 --- html/changelogs/AutoChangeLog-pr-5490.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5490.yml diff --git a/html/changelogs/AutoChangeLog-pr-5490.yml b/html/changelogs/AutoChangeLog-pr-5490.yml new file mode 100644 index 00000000000..4b55a8060da --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5490.yml @@ -0,0 +1,6 @@ +author: FalseIncarnate +delete-after: True +changes: + - tweak: "Repairing burn damage to robotic limbs now consumes cable in the process. Each length used repairs 3 burn damage, up to 15 damage per click." + - tweak: "Repairing brute damage to robotic limbs now uses 1 fuel per repair (click). Heal amount unchanged." + - tweak: "Self-repairing with cables or welders now incurs a 1 second delay between click and heal completion. Being repaired by a friend is still no delay (but requires a friend)." From 67db978f2f8b5c5ab8f06884965075a949f98681 Mon Sep 17 00:00:00 2001 From: Krausus Date: Fri, 19 Aug 2016 22:09:19 -0400 Subject: [PATCH 23/23] Removes Alternate Languages --- html/changelog.html | 34 +++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 34 +++++++++++++++++++++++ html/changelogs/AutoChangeLog-pr-5482.yml | 4 --- html/changelogs/AutoChangeLog-pr-5483.yml | 5 ---- html/changelogs/AutoChangeLog-pr-5486.yml | 7 ----- html/changelogs/AutoChangeLog-pr-5490.yml | 6 ---- html/changelogs/AutoChangeLog-pr-5493.yml | 4 --- html/changelogs/AutoChangeLog-pr-5496.yml | 4 --- html/changelogs/AutoChangeLog-pr-5497.yml | 4 --- html/changelogs/AutoChangeLog-pr-5500.yml | 4 --- 10 files changed, 68 insertions(+), 38 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5482.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5483.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5486.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5490.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5493.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5496.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5497.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5500.yml diff --git a/html/changelog.html b/html/changelog.html index a74a9abecc0..20cfeffe0f7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,40 @@ -->

+

19 August 2016

+

Crazylemon updated:

+
    +
  • pAIs should now save
  • +
+

FalseIncarnate updated:

+
    +
  • Repairing burn damage to robotic limbs now consumes cable in the process. Each length used repairs 3 burn damage, up to 15 damage per click.
  • +
  • Repairing brute damage to robotic limbs now uses 1 fuel per repair (click). Heal amount unchanged.
  • +
  • Self-repairing with cables or welders now incurs a 1 second delay between click and heal completion. Being repaired by a friend is still no delay (but requires a friend).
  • +
+

Fox McCloud updated:

+
    +
  • Adds in the Kinetic Smasher as a mining purchase
  • +
  • Fixes slap emote text being the wrong partial color
  • +
  • Fixes the attack text of simple animals attacking human mobs
  • +
+

IcyV updated:

+
    +
  • Adds in an amount of new graffiti
  • +
  • Fixes the issue of other graffiti only being able to be done in black.
  • +
+

Krausus updated:

+
    +
  • Flavor text and records are no longer horrifically butchered when saved in the database.
  • +
+

TheDZD updated:

+
    +
  • Lowered genetic instability damage thresholds by 5 across the board. Effectively meaning that you can have one additional minor power without shifting into the next threshold.
  • +
  • Lowered the rate at which damage scales with instability, and the decreased upper cap on each damage type.
  • +
  • The base activation probability for powers is now 100%, rather than 45%. Abilities affected include everything except Cloak of Darkness, Chameleon, No Breathing, Hulk, Telekinesis, and X-Ray Vision, which all have their own independent activation chances (varying from 5% to 10%).
  • +
  • Increases activation chances of TK (10% to 15%), No Breathing (10% to 25%), Cloak of Darkness (10% to 25%), Hulk (5% to 15%), X-Ray Vision (10% to 15%), and Chameleon (10% to 25%).
  • +
+

18 August 2016

Alexshreds updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index c1ae0b52e36..46019a9fa0e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2808,3 +2808,37 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Gives proper mix_messages for Uplink, Synthignon, and Synth 'n Soda drinks tristan1333: - rscadd: Spacepod paint +2016-08-19: + Crazylemon: + - bugfix: pAIs should now save + FalseIncarnate: + - tweak: Repairing burn damage to robotic limbs now consumes cable in the process. + Each length used repairs 3 burn damage, up to 15 damage per click. + - tweak: Repairing brute damage to robotic limbs now uses 1 fuel per repair (click). + Heal amount unchanged. + - tweak: Self-repairing with cables or welders now incurs a 1 second delay between + click and heal completion. Being repaired by a friend is still no delay (but + requires a friend). + Fox McCloud: + - rscadd: Adds in the Kinetic Smasher as a mining purchase + - bugfix: Fixes slap emote text being the wrong partial color + - bugfix: Fixes the attack text of simple animals attacking human mobs + IcyV: + - rscadd: Adds in an amount of new graffiti + - bugfix: Fixes the issue of other graffiti only being able to be done in black. + Krausus: + - bugfix: Flavor text and records are no longer horrifically butchered when saved + in the database. + TheDZD: + - tweak: Lowered genetic instability damage thresholds by 5 across the board. Effectively + meaning that you can have one additional minor power without shifting into the + next threshold. + - tweak: Lowered the rate at which damage scales with instability, and the decreased + upper cap on each damage type. + - tweak: The base activation probability for powers is now 100%, rather than 45%. + Abilities affected include everything except Cloak of Darkness, Chameleon, No + Breathing, Hulk, Telekinesis, and X-Ray Vision, which all have their own independent + activation chances (varying from 5% to 10%). + - tweak: Increases activation chances of TK (10% to 15%), No Breathing (10% to 25%), + Cloak of Darkness (10% to 25%), Hulk (5% to 15%), X-Ray Vision (10% to 15%), + and Chameleon (10% to 25%). diff --git a/html/changelogs/AutoChangeLog-pr-5482.yml b/html/changelogs/AutoChangeLog-pr-5482.yml deleted file mode 100644 index 0ee25b4194e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5482.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Adds in the Kinetic Smasher as a mining purchase" diff --git a/html/changelogs/AutoChangeLog-pr-5483.yml b/html/changelogs/AutoChangeLog-pr-5483.yml deleted file mode 100644 index 741bcaf6589..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5483.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: IcyV -delete-after: True -changes: - - rscadd: "Adds in an amount of new graffiti" - - bugfix: "Fixes the issue of other graffiti only being able to be done in black." diff --git a/html/changelogs/AutoChangeLog-pr-5486.yml b/html/changelogs/AutoChangeLog-pr-5486.yml deleted file mode 100644 index 7558387ce4d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5486.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: TheDZD -delete-after: True -changes: - - tweak: "Lowered genetic instability damage thresholds by 5 across the board. Effectively meaning that you can have one additional minor power without shifting into the next threshold." - - tweak: "Lowered the rate at which damage scales with instability, and the decreased upper cap on each damage type." - - tweak: "The base activation probability for powers is now 100%, rather than 45%. Abilities affected include everything except Cloak of Darkness, Chameleon, No Breathing, Hulk, Telekinesis, and X-Ray Vision, which all have their own independent activation chances (varying from 5% to 10%)." - - tweak: "Increases activation chances of TK (10% to 15%), No Breathing (10% to 25%), Cloak of Darkness (10% to 25%), Hulk (5% to 15%), X-Ray Vision (10% to 15%), and Chameleon (10% to 25%)." diff --git a/html/changelogs/AutoChangeLog-pr-5490.yml b/html/changelogs/AutoChangeLog-pr-5490.yml deleted file mode 100644 index 4b55a8060da..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5490.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: FalseIncarnate -delete-after: True -changes: - - tweak: "Repairing burn damage to robotic limbs now consumes cable in the process. Each length used repairs 3 burn damage, up to 15 damage per click." - - tweak: "Repairing brute damage to robotic limbs now uses 1 fuel per repair (click). Heal amount unchanged." - - tweak: "Self-repairing with cables or welders now incurs a 1 second delay between click and heal completion. Being repaired by a friend is still no delay (but requires a friend)." diff --git a/html/changelogs/AutoChangeLog-pr-5493.yml b/html/changelogs/AutoChangeLog-pr-5493.yml deleted file mode 100644 index 88b8031d3c0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5493.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes slap emote text being the wrong partial color" diff --git a/html/changelogs/AutoChangeLog-pr-5496.yml b/html/changelogs/AutoChangeLog-pr-5496.yml deleted file mode 100644 index f50ad40cb66..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5496.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon -delete-after: True -changes: - - bugfix: "pAIs should now save" diff --git a/html/changelogs/AutoChangeLog-pr-5497.yml b/html/changelogs/AutoChangeLog-pr-5497.yml deleted file mode 100644 index 3b81863ec35..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5497.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - bugfix: "Fixes the attack text of simple animals attacking human mobs" diff --git a/html/changelogs/AutoChangeLog-pr-5500.yml b/html/changelogs/AutoChangeLog-pr-5500.yml deleted file mode 100644 index b516c79cd1e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5500.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Krausus -delete-after: True -changes: - - bugfix: "Flavor text and records are no longer horrifically butchered when saved in the database."