From 1f364c1bcf4df2a6b12a868ec5f2420206edb74a Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 17 Aug 2016 20:31:37 -0400 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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