diff --git a/code/game/objects/grenades/flashbang.dm b/code/game/objects/grenades/flashbang.dm index 3b5d5430036..fc762d1b7b0 100644 --- a/code/game/objects/grenades/flashbang.dm +++ b/code/game/objects/grenades/flashbang.dm @@ -99,49 +99,74 @@ M.update_icons() -/obj/item/weapon/grenade/flashbang/clusterbang +/obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve desc = "Use of this weapon may constiute a war crime in your area, consult your local captain." name = "clusterbang" icon = 'icons/obj/grenade.dmi' icon_state = "clusterbang" - var/child = 0 - prime() - //world << "Armed!" - var/numspawned = rand(4,8) - //world << numspawned - var/again = 0 - if(!child) - for(var/more = numspawned,more > 0,more--) - if(prob(35)) - again++ - numspawned -- +/obj/item/weapon/grenade/flashbang/clusterbang/prime() + var/numspawned = rand(4,8) + var/again = 0 + for(var/more = numspawned,more > 0,more--) + if(prob(35)) + again++ + numspawned -- - for(,numspawned > 0, numspawned--) - //world << "Spawned Flashbang!" - spawn(0) - var/obj/item/weapon/grenade/flashbang/F = new /obj/item/weapon/grenade/flashbang(src) - F.loc = src.loc - F.icon_state = "flashbang_active" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - F.active = 1 - F.banglet = 1 - var/stepdist = rand(1,3) - walk_away(F,src,stepdist) - var/dettime = rand(15,60) - spawn(dettime) - F.prime() + for(,numspawned > 0, numspawned--) + spawn(0) + new /obj/item/weapon/grenade/flashbang/cluster(src.loc)//Launches flashbangs + playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - for(,again > 0, again--) - //world << "Spawned CFlashbang!" - spawn(0) - var/obj/item/weapon/grenade/flashbang/clusterbang/F = new /obj/item/weapon/grenade/flashbang/clusterbang(src) - F.loc = src.loc - F.active = 1 - F.child = 1 - F.icon_state = "clusterbang_active" - var/stepdist = rand(1,4) - walk_away(F,src,stepdist) - spawn(det_time) - F.prime() + for(,again > 0, again--) + spawn(0) + new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs + playsound(src.loc, 'armbomb.ogg', 75, 1, -3) + spawn(0) + del(src) return + +/obj/item/weapon/grenade/flashbang/clusterbang/segment + desc = "A smaller segment of a clusterbang. Better run." + name = "clusterbang segment" + icon = 'icons/obj/grenade.dmi' + icon_state = "clusterbang_segment" + +/obj/item/weapon/grenade/flashbang/clusterbang/segment/New()//Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode + icon_state = "clusterbang_segment_active" + active = 1 + banglet = 1 + var/stepdist = rand(1,4)//How far to step + var/temploc = src.loc//Saves the current location to know where to step away from + walk_away(src,temploc,stepdist)//I must go, my people need me + var/dettime = rand(15,60) + spawn(dettime) + prime() + ..() + +/obj/item/weapon/grenade/flashbang/clusterbang/segment/prime() + var/numspawned = rand(4,8) + for(var/more = numspawned,more > 0,more--) + if(prob(35)) + numspawned -- + + for(,numspawned > 0, numspawned--) + spawn(0) + new /obj/item/weapon/grenade/flashbang/cluster(src.loc) + playsound(src.loc, 'armbomb.ogg', 75, 1, -3) + spawn(0) + del(src) + return + +/obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang + spawn(0) + icon_state = "flashbang_active" + active = 1 + banglet = 1 + var/stepdist = rand(1,3) + var/temploc = src.loc + walk_away(src,temploc,stepdist) + var/dettime = rand(15,60) + spawn(dettime) + prime() + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm deleted file mode 100644 index 41c5ad27755..00000000000 --- a/code/game/objects/items/weapons/grenades.dm +++ /dev/null @@ -1,507 +0,0 @@ -/* -CONTAINS: -EMP GRENADE -FLASHBANG -CRITTER GRENADE - -*/ - -/obj/item/weapon/empgrenade - desc = "It is set to detonate in 5 seconds." - name = "emp grenade" - w_class = 2.0 - icon = 'icons/obj/device.dmi' - icon_state = "emp" - item_state = "emp" - throw_speed = 4 - throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = SLOT_BELT - origin_tech = "materials=2;magnets=3" - var/active = 0 - var/det_time = 50 - - proc/prime() - return - - proc/clown_check(var/mob/living/user) - return - - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container - if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src)&&(!active)&&(clown_check(user))) - user << "\red You prime the emp grenade! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "empar" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn( src.det_time ) - prime() - return - user.dir = get_dir(user, target) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - return - - - attack_self(mob/user as mob) - if(!active) - if(clown_check(user)) - user << "\red You prime the EMP grenade! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "empar" - add_fingerprint(user) - spawn(src.det_time) - prime() - return - return - - - prime() - playsound(src.loc, 'Welder2.ogg', 25, 1) - var/turf/T = get_turf(src) - if(T) - T.hotspot_expose(700,125) - if(empulse(src, 5, 7)) - del(src) - return - - - clown_check(var/mob/living/user) - if((CLUMSY in user.mutations) && prob(50)) - user << "\red Huh? How does this thing work?!" - src.active = 1 - src.icon_state = "empar" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn( 5 ) - prime() - return 0 - return 1 - - - -/****************************Flashbang***********************************************/ -/obj/item/weapon/flashbang - desc = "It is set to detonate in 3 seconds." - name = "flashbang" - icon = 'icons/obj/grenade.dmi' - icon_state = "flashbang" - w_class = 2.0 - item_state = "flashbang" - throw_speed = 4 - throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = SLOT_BELT - origin_tech = "materials=2;combat=1" - var/active = 0 - var/det_time = 30 - var/banglet = 0 - - proc/bang(var/turf/T , var/mob/living/carbon/M) - return - - proc/prime() - return - - proc/clown_check(var/mob/living/user) - return - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if (isscrewdriver(W)) - switch(src.det_time) - if ("1") - src.det_time = 30 - user.show_message("\blue You set the flashbang for 3 second detonation time.") - src.desc = "It is set to detonate in 3 seconds." - if ("30") - src.det_time = 100 - user.show_message("\blue You set the flashbang for 10 second detonation time.") - src.desc = "It is set to detonate in 10 seconds." - if ("100") - src.det_time = 1 - user.show_message("\blue You set the flashbang for instant detonation.") - src.desc = "It is set to detonate instantly." - src.add_fingerprint(user) - ..() - return - - - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container - if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src)&&(!active)&&(clown_check(user))) - user << "\red You prime the flashbang! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "flashbang1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn(src.det_time) - prime() - return - user.dir = get_dir(user, target) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - return - - - attack_paw(mob/user as mob) - return src.attack_hand(user) - - - attack_hand() - walk(src, null, null) - ..() - return - - bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. - if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging - for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions. - S.active = 0 // -- Polymorph - S.icon_state = "shield0" - - M << "\red BANG" - playsound(src.loc, 'bang.ogg', 25, 1) - -//Checking for protections - var/eye_safety = 0 - var/ear_safety = 0 - if(iscarbon(M)) - eye_safety = M.eyecheck() - if(ishuman(M)) - if(istype(M:ears, /obj/item/clothing/ears/earmuffs)) - ear_safety += 2 - if(HULK in M.mutations) - ear_safety += 1 - if(istype(M:head, /obj/item/clothing/head/helmet)) - ear_safety += 1 - -//Flashing everyone - if(eye_safety < 1) - flick("e_flash", M.flash) - M.eye_stat += rand(1, 3) - M.Stun(2) - M.Weaken(10) - - - -//Now applying sound - if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M)) - if(ear_safety > 0) - M.Stun(2) - M.Weaken(1) - else - M.Stun(10) - M.Weaken(3) - if ((prob(14) || (M == src.loc && prob(70)))) - M.ear_damage += rand(1, 10) - else - M.ear_damage += rand(0, 5) - M.ear_deaf = max(M.ear_deaf,15) - - else if(get_dist(M, T) <= 5) - if(!ear_safety) - M.Stun(8) - M.ear_damage += rand(0, 3) - M.ear_deaf = max(M.ear_deaf,10) - - else if(!ear_safety) - M.Stun(4) - M.ear_damage += rand(0, 1) - M.ear_deaf = max(M.ear_deaf,5) - -//This really should be in mob not every check - if (M.eye_stat >= 20) - M << "\red Your eyes start to burn badly!" - M.disabilities |= NEARSIGHTED - if(!banglet && !(istype(src , /obj/item/weapon/flashbang/clusterbang))) - if (prob(M.eye_stat - 20 + 1)) - M << "\red You can't see anything!" - M.sdisabilities |= BLIND - if (M.ear_damage >= 15) - M << "\red Your ears start to ring badly!" - if(!banglet && !(istype(src , /obj/item/weapon/flashbang/clusterbang))) - if (prob(M.ear_damage - 10 + 5)) - M << "\red You can't hear anything!" - M.sdisabilities |= DEAF - else - if (M.ear_damage >= 5) - M << "\red Your ears start to ring!" - M.update_icons() - - prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. - var/turf/T = get_turf(src) - if(T) - T.hotspot_expose(700,125) - - for(var/obj/structure/closet/L in view(T, null)) - if(locate(/mob/living/carbon/, L)) - for(var/mob/living/carbon/M in L) - bang(T, M) - - - for(var/mob/living/carbon/M in viewers(T, null)) - bang(T, M) - - for(var/obj/effect/blob/B in view(8,T)) //Blob damage here - var/damage = round(30/(get_dist(B,T)+1)) - B.health -= damage - B.update_icon() - del(src) - return - - - attack_self(mob/user as mob) - if(!active) - if(clown_check(user)) - user << "\red You prime the flashbang! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "flashbang1" - add_fingerprint(user) - spawn( src.det_time ) - prime() - return - return - - - attack_hand() - walk(src, null, null) - ..() - return - - - clown_check(var/mob/living/user) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red Huh? How does this thing work?!" - src.active = 1 - src.icon_state = "flashbang1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn( 5 ) - prime() - return 0 - return 1 - -/obj/item/weapon/flashbang/clusterbang - desc = "Use of this weapon may constiute a war crime in your area, consult your local captain." - name = "clusterbang" - icon = 'icons/obj/grenade.dmi' - icon_state = "clusterbang" - var/child = 0 - - attack_self(mob/user as mob) - if(!active) - //world << "cluster attack self" - user << "\red You prime the clusterbang! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "clusterbang1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn(src.det_time) - arm(user) - return - - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container - if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src)&&(!active)) - //world << "cluster after attack" - arm(user) - user.dir = get_dir(user, target) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - return - -/obj/item/weapon/flashbang/clusterbang/proc/arm(mob/user as mob) - - //world << "Armed!" - var/numspawned = rand(4,8) -// world << numspawned - var/again = 0 - if(!child) - for(var/more = numspawned,more > 0,more--) - if(prob(35)) - again++ - numspawned -- - - for(,numspawned > 0, numspawned--) - //world << "Spawned Flashbang!" - spawn(0) - var/obj/item/weapon/flashbang/F = new /obj/item/weapon/flashbang(src) - F.loc = src.loc - F.icon_state = "flashbang1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - F.active = 1 - F.banglet = 1 - var/stepdist = rand(1,3) - walk_away(F,src,stepdist) - var/dettime = rand(15,60) - spawn(dettime) - F.prime() - - for(,again > 0, again--) - //world << "Spawned CFlashbang!" - spawn(0) - var/obj/item/weapon/flashbang/clusterbang/F = new /obj/item/weapon/flashbang/clusterbang(src) - F.loc = src.loc - F.active = 1 - F.child = 1 - F.icon_state = "clusterbang1" - var/stepdist = rand(1,4) - walk_away(F,src,stepdist) - spawn(30) - F.arm() - - spawn(70) - prime() - - return - - - -/****************************Critter Grenades***********************************************/ - - -/obj/item/weapon/spawnergrenade - desc = "It is set to detonate in 3 seconds. It will unleash unleash an unspecified anomaly into the vicinity." - name = "delivery grenade" - icon = 'icons/obj/grenade.dmi' - icon_state = "delivery" - w_class = 2.0 - item_state = "flashbang" - throw_speed = 4 - throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = SLOT_BELT - origin_tech = "materials=3;magnets=4" - var/active = 0 - var/det_time = 30 - var/banglet = 0 - var/spawner_type = null // must be an object path - var/deliveryamt = 1 // amount of type to deliver - - - proc/prime() - return - - proc/clown_check(var/mob/living/user) - return - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if (isscrewdriver(W)) - switch(src.det_time) - if ("1") - src.det_time = 30 - user.show_message("\blue You set the delivery grenade for 3 second detonation time.") - src.desc = "It is set to detonate in 3 seconds." - if ("30") - src.det_time = 100 - user.show_message("\blue You set the delivery grenade for 10 second detonation time.") - src.desc = "It is set to detonate in 10 seconds." - if ("100") - src.det_time = 1 - user.show_message("\blue You set the delivery grenade for instant detonation.") - src.desc = "It is set to detonate instantly." - src.add_fingerprint(user) - ..() - return - - - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container - if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src)&&(!active)&&(clown_check(user))) - user << "\red You prime the delivery grenade! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "delivery1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn(src.det_time) - prime() - return - user.dir = get_dir(user, target) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - return - - - attack_paw(mob/user as mob) - return src.attack_hand(user) - - - attack_hand() - walk(src, null, null) - ..() - return - - prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. - - if(spawner_type && deliveryamt) - // Make a quick flash - var/turf/T = get_turf(src) - playsound(T, 'phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) // flash dose faggots - - for(var/i=1, i<=deliveryamt, i++) - var/atom/movable/x = new spawner_type - x.loc = T - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(x, pick(NORTH,SOUTH,EAST,WEST)) - - // Spawn some hostile syndicate critters - if(istype(x, /obj/effect/critter)) - var/obj/effect/critter/C = x - - C.atkcarbon = 1 - C.atksilicon = 1 - C.atkmech = 0 - C.atksynd = 0 - C.aggressive = 1 - - del(src) - return - - - attack_self(mob/user as mob) - if(!active) - if(clown_check(user)) - user << "\red You prime the delivery grenade! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "delivery1" - add_fingerprint(user) - spawn( src.det_time ) - prime() - return - return - - - attack_hand() - walk(src, null, null) - ..() - return - - - clown_check(var/mob/living/user) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red Huh? How does this thing work?!" - src.active = 1 - src.icon_state = "delivery1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn( 5 ) - prime() - return 0 - return 1 - -/obj/item/weapon/spawnergrenade/manhacks - name = "manhack delivery grenade" - spawner_type = /obj/effect/critter/manhack - deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" - -/obj/item/weapon/spawnergrenade/spesscarp - name = "carp delivery grenade" - spawner_type = /mob/living/simple_animal/carp - deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/carp.dm b/code/modules/mob/living/simple_animal/carp.dm index 730eb8fa85d..dde1b85f63b 100644 --- a/code/modules/mob/living/simple_animal/carp.dm +++ b/code/modules/mob/living/simple_animal/carp.dm @@ -42,7 +42,30 @@ var/mob/living/target_mob //Once the bear enters attack stance, it will try to chase this mob. This it to prevent it changing it's mind between multiple mobs. /mob/living/simple_animal/carp/Life() - ..() + if(stat == DEAD) + walk(src,0)//STOP FUCKING MOVING GODDAMN + if(health > 0) + icon_state = icon_living + dead_mob_list -= src + living_mob_list += src + stat = CONSCIOUS + density = 1 + return + + + if(health < 1) + Die() + + if(health > maxHealth) + health = maxHealth + + if(!ckey && !stop_automated_movement) + if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. + turns_since_move++ + if(turns_since_move >= turns_per_move) + if(!(stop_automated_movement_when_pulled && pulledby)) //Soma animals don't move when pulled + Move(get_step(src,pick(cardinal))) + turns_since_move = 0 if(!stat) switch(stance) diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 1fc6daeb9d5..d548e040c65 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ