mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-25 13:07:46 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into turfs
# Conflicts: # code/modules/mob/living/simple_animal/hostile/hostile.dm
This commit is contained in:
@@ -671,8 +671,9 @@ var/global/nologevent = 0
|
||||
alert("Unable to start the game as it is not set up.")
|
||||
return
|
||||
if(ticker.current_state == GAME_STATE_PREGAME)
|
||||
if(alert(usr, "Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes")
|
||||
return
|
||||
if(config.start_now_confirmation)
|
||||
if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes")
|
||||
return
|
||||
ticker.current_state = GAME_STATE_SETTING_UP
|
||||
log_admin("[key_name(usr)] has started the game.")
|
||||
message_admins("[key_name_admin(usr)] has started the game.")
|
||||
|
||||
@@ -113,7 +113,9 @@
|
||||
<A href='?src=[UID()];secretsfun=schoolgirl'>Japanese Animes Mode</A>
|
||||
<A href='?src=[UID()];secretsfun=eagles'>Egalitarian Station Mode</A><BR>
|
||||
<A href='?src=[UID()];secretsfun=guns'>Summon Guns</A>
|
||||
<A href='?src=[UID()];secretsfun=magic'>Summon Magic</A>
|
||||
<A href='?src=[UID()];secretsfun=magic'>Summon Magic</A>
|
||||
<A href='?src=[UID()];secretsfun=revolver'>Summon Revolver Duel</A>
|
||||
<A href='?src=[UID()];secretsfun=fakerevolver'>Summon Suicidal Revolver Duel</A>
|
||||
<BR>
|
||||
<A href='?src=[UID()];secretsfun=rolldice'>Roll the Dice</A><BR>
|
||||
<BR>
|
||||
|
||||
@@ -2843,11 +2843,19 @@
|
||||
if("guns")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SG")
|
||||
usr.rightandwrong(0)
|
||||
usr.rightandwrong(FALSE)
|
||||
if("magic")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SM")
|
||||
usr.rightandwrong(1)
|
||||
usr.rightandwrong(TRUE)
|
||||
if("revolver")
|
||||
feedback_inc("admin_secrets_fun_used", 1)
|
||||
feedback_add_details("admin_secrets_fun_used", "SRD")
|
||||
usr.rightandwrong(FALSE, revolver_fight = TRUE)
|
||||
if("fakerevolver")
|
||||
feedback_inc("admin_secrets_fun_used", 1)
|
||||
feedback_add_details("admin_secrets_fun_used", "SFD")
|
||||
usr.rightandwrong(FALSE, fake_revolver_fight = TRUE)
|
||||
if("tdomereset")
|
||||
var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
|
||||
if(delete_mobs == "Cancel")
|
||||
|
||||
@@ -532,6 +532,10 @@
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
up = 0
|
||||
tint = 0
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/tajblind/eng
|
||||
name = "industrial veil"
|
||||
|
||||
@@ -165,6 +165,10 @@
|
||||
flags_cover = GLASSESCOVERSEYES
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
up = 0
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/tajblind/attack_self()
|
||||
toggle_veil()
|
||||
@@ -177,6 +181,10 @@
|
||||
flags_cover = GLASSESCOVERSEYES
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
up = 0
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/health/tajblind/attack_self()
|
||||
toggle_veil()
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
/datum/event/grid_check //NOTE: Times are measured in master controller ticks!
|
||||
announceWhen = 5
|
||||
|
||||
|
||||
/datum/event/grid_check/setup()
|
||||
endWhen = rand(30,120)
|
||||
|
||||
/datum/event/grid_check/start()
|
||||
power_failure(0)
|
||||
|
||||
var/sound/S = sound('sound/effects/powerloss.ogg')
|
||||
for(var/mob/living/M in GLOB.player_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if(!M.client || !is_station_level(T.z))
|
||||
continue
|
||||
SEND_SOUND(M, S)
|
||||
|
||||
/datum/event/grid_check/announce()
|
||||
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
|
||||
|
||||
|
||||
@@ -55,6 +55,11 @@
|
||||
then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \
|
||||
shells into the gun."
|
||||
|
||||
/obj/item/toy/russian_revolver/trick_revolver //oh no
|
||||
description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \
|
||||
then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \
|
||||
will tell you what caliber you need."
|
||||
|
||||
//*******
|
||||
//*Melee*
|
||||
//*******
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,50)
|
||||
volume = 50
|
||||
burn_state = FIRE_PROOF
|
||||
antable = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/New()
|
||||
..()
|
||||
|
||||
@@ -13,10 +13,42 @@
|
||||
var/transfer_efficiency = 1.0
|
||||
var/instant_application = 0 //if we want to bypass the forcedfeed delay
|
||||
var/taste = TRUE//whether you can taste eating from this
|
||||
var/antable = TRUE // Will ants come near it?
|
||||
var/ant_location = null
|
||||
var/ant_timer = null
|
||||
burn_state = FLAMMABLE
|
||||
container_type = INJECTABLE
|
||||
|
||||
/obj/item/reagent_containers/food/New()
|
||||
..()
|
||||
/obj/item/reagent_containers/food/Initialize(mapload)
|
||||
. = ..()
|
||||
pixel_x = rand(-5, 5) //Randomizes postion
|
||||
pixel_y = rand(-5, 5)
|
||||
if(antable)
|
||||
ant_location = get_turf(src)
|
||||
ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE)
|
||||
|
||||
/obj/item/reagent_containers/food/Destroy()
|
||||
ant_location = null
|
||||
if(ant_timer)
|
||||
deltimer(ant_timer)
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/food/proc/check_for_ants()
|
||||
if(!antable)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
if(isturf(loc) && !locate(/obj/structure/table) in T)
|
||||
if(ant_location == T)
|
||||
if(prob(15))
|
||||
if(!locate(/obj/effect/decal/ants) in T)
|
||||
new /obj/effect/decal/ants(T)
|
||||
antable = FALSE
|
||||
desc += " It appears to be infested with ants. Yuck!"
|
||||
reagents.add_reagent("ants", 1) // Don't eat things with ants in i you weirdo.
|
||||
if(ant_timer)
|
||||
deltimer(ant_timer)
|
||||
else
|
||||
ant_location = T
|
||||
if(ant_timer)
|
||||
deltimer(ant_timer)
|
||||
ant_timer = addtimer(CALLBACK(src, .proc/check_for_ants), 3000, TIMER_STOPPABLE)
|
||||
@@ -8,35 +8,36 @@
|
||||
|
||||
|
||||
/mob/proc/bee_friendly()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/bee_friendly()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/bot/bee_friendly()
|
||||
if(paicard)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/diona/bee_friendly()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/bee_friendly()
|
||||
if(isdiona(src)) //bees pollinate plants, duh.
|
||||
return 1
|
||||
return TRUE
|
||||
if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL)))
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/structure/beebox
|
||||
name = "apiary"
|
||||
desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!"
|
||||
desc = "Dr. Miles Manners is just your average wasp-themed super hero by day, but by night he becomes DR. BEES!"
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
icon_state = "beebox"
|
||||
anchored = 1
|
||||
density = 1
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
max_integrity = 300
|
||||
var/mob/living/simple_animal/hostile/poison/bees/queen/queen_bee = null
|
||||
var/list/bees = list() //bees owned by the box, not those inside it
|
||||
var/list/honeycombs = list()
|
||||
@@ -44,8 +45,8 @@
|
||||
var/bee_resources = 0
|
||||
|
||||
|
||||
/obj/structure/beebox/New()
|
||||
..()
|
||||
/obj/structure/beebox/Initialize(mapload)
|
||||
. = ..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
|
||||
@@ -66,12 +67,11 @@
|
||||
var/random_reagent = FALSE
|
||||
|
||||
|
||||
/obj/structure/beebox/premade/New()
|
||||
..()
|
||||
|
||||
/obj/structure/beebox/premade/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/reagent/R = null
|
||||
if(random_reagent)
|
||||
R = get_random_reagent_id()
|
||||
R = GLOB.chemical_reagents_list[get_random_reagent_id()]
|
||||
|
||||
queen_bee = new(src)
|
||||
queen_bee.beehome = src
|
||||
@@ -83,7 +83,7 @@
|
||||
honey_frames += HF
|
||||
|
||||
for(var/i in 1 to get_max_bees())
|
||||
var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src)
|
||||
var/mob/living/simple_animal/hostile/poison/bees/B = new(src)
|
||||
bees += B
|
||||
B.beehome = src
|
||||
B.assign_reagent(R)
|
||||
@@ -93,7 +93,7 @@
|
||||
|
||||
|
||||
/obj/structure/beebox/process()
|
||||
if(queen_bee && (!queen_bee.beegent || !queen_bee.beegent.can_synth))
|
||||
if(queen_bee)
|
||||
if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST)
|
||||
if(honeycombs.len < get_max_honeycomb())
|
||||
bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0)
|
||||
@@ -109,7 +109,7 @@
|
||||
if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee)
|
||||
if(!freebee)
|
||||
bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0)
|
||||
var/mob/living/simple_animal/hostile/poison/bees/worker/B = new(src)
|
||||
var/mob/living/simple_animal/hostile/poison/bees/B = new(get_turf(src))
|
||||
B.beehome = src
|
||||
B.assign_reagent(queen_bee.beegent)
|
||||
bees += B
|
||||
@@ -152,14 +152,16 @@
|
||||
if(istype(I, /obj/item/honey_frame))
|
||||
var/obj/item/honey_frame/HF = I
|
||||
if(honey_frames.len < BEEBOX_MAX_FRAMES)
|
||||
if(!user.unEquip(HF))
|
||||
return
|
||||
visible_message("<span class='notice'>[user] adds a frame to the apiary.</span>")
|
||||
user.unEquip(HF)
|
||||
HF.forceMove(src)
|
||||
honey_frames += HF
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There's no room for anymore frames in the apiary!</span>")
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(iswrench(I))
|
||||
if(default_unfasten_wrench(user, I, time = 20))
|
||||
return
|
||||
|
||||
@@ -169,25 +171,27 @@
|
||||
return
|
||||
|
||||
var/obj/item/queen_bee/qb = I
|
||||
user.unEquip(qb)
|
||||
if(!qb.queen.beegent || (qb.queen.beegent && qb.queen.beegent.can_synth))
|
||||
if(!user.unEquip(qb))
|
||||
return
|
||||
qb.queen.forceMove(src)
|
||||
bees += qb.queen
|
||||
queen_bee = qb.queen
|
||||
qb.queen = null
|
||||
else
|
||||
visible_message("<span class='notice'>The [qb] refuses to settle down. Maybe it's something to do with its reagent?</span>")
|
||||
return
|
||||
|
||||
if(queen_bee)
|
||||
visible_message("<span class='notice'>[user] sets [qb] down inside the apiary, making it [user.p_their()] new home.</span>")
|
||||
var/relocated = 0
|
||||
for(var/b in bees)
|
||||
var/mob/living/simple_animal/hostile/poison/bees/worker/B = b
|
||||
var/mob/living/simple_animal/hostile/poison/bees/B = b
|
||||
if(B.reagent_incompatible(queen_bee))
|
||||
bees -= B
|
||||
B.beehome = null
|
||||
if(B.loc == src)
|
||||
B.forceMove(get_turf(src))
|
||||
B.forceMove(drop_location())
|
||||
relocated++
|
||||
if(relocated)
|
||||
to_chat(user, "<span class='warning'>This queen has a different reagent to some of the bees who live here, those bees will not return to this apiary!</span>")
|
||||
@@ -196,6 +200,8 @@
|
||||
to_chat(user, "<span class='warning'>The queen bee disappeared! bees disappearing has been in the news lately...</span>")
|
||||
|
||||
qdel(qb)
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/beebox/attack_hand(mob/user)
|
||||
@@ -208,7 +214,7 @@
|
||||
if(B.isqueen)
|
||||
continue
|
||||
if(B.loc == src)
|
||||
B.forceMove(get_turf(src))
|
||||
B.forceMove(drop_location())
|
||||
B.target = user
|
||||
bees = TRUE
|
||||
if(bees)
|
||||
@@ -254,3 +260,16 @@
|
||||
QB.forceMove(get_turf(src))
|
||||
visible_message("<span class='notice'>[user] removes the queen from the apiary.</span>")
|
||||
queen_bee = null
|
||||
|
||||
/obj/structure/beebox/deconstruct(disassembled = TRUE)
|
||||
new /obj/item/stack/sheet/wood(loc, 20)
|
||||
for(var/mob/living/simple_animal/hostile/poison/bees/B in bees)
|
||||
if(B.loc == src)
|
||||
B.forceMove(drop_location())
|
||||
for(var/obj/item/honey_frame/HF in honey_frames)
|
||||
HF.forceMove(drop_location())
|
||||
honey_frames -= HF
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/beebox/unwrenched
|
||||
anchored = FALSE
|
||||
@@ -95,7 +95,8 @@
|
||||
force = round((5 + seed.potency / 2.5), 1)
|
||||
|
||||
/obj/item/grown/nettle/death/pickup(mob/living/carbon/user)
|
||||
if(..() && ishuman(user)) // If the pickup succeeded and is humanoid
|
||||
. = ..()
|
||||
if(. && ishuman(user)) // If the pickup succeeded and is humanoid
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!H.gloves && prob(50))
|
||||
user.Paralyse(5)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
/mob/proc/put_in_l_hand(var/obj/item/W)
|
||||
if(!put_in_hand_check(W))
|
||||
return 0
|
||||
if(!l_hand)
|
||||
if(!l_hand && has_left_hand())
|
||||
W.forceMove(src) //TODO: move to equipped?
|
||||
l_hand = W
|
||||
W.layer = 20 //TODO: move to equipped?
|
||||
@@ -51,7 +51,7 @@
|
||||
/mob/proc/put_in_r_hand(var/obj/item/W)
|
||||
if(!put_in_hand_check(W))
|
||||
return 0
|
||||
if(!r_hand)
|
||||
if(!r_hand && has_right_hand())
|
||||
W.forceMove(src)
|
||||
r_hand = W
|
||||
W.layer = 20
|
||||
|
||||
@@ -4,22 +4,15 @@
|
||||
|
||||
if(!iscarbon(target)) //something is bypassing the give arguments, no clue what, adding a sanity check JIC
|
||||
to_chat(usr, "<span class='danger'>Wait a second... \the [target] HAS NO HANDS! AHH!</span>")//cheesy messages ftw
|
||||
return
|
||||
|
||||
if(target.incapacitated() || usr.incapacitated() || target.client == null)
|
||||
return
|
||||
if(target.stat == 2 || usr.stat == 2|| target.client == null)
|
||||
return
|
||||
var/obj/item/I
|
||||
if(!usr.hand && usr.r_hand == null)
|
||||
to_chat(usr, "<span class='warning'> You don't have anything in your right hand to give to [target.name]</span>")
|
||||
return
|
||||
if(usr.hand && usr.l_hand == null)
|
||||
to_chat(usr, "<span class='warning'> You don't have anything in your left hand to give to [target.name]</span>")
|
||||
return
|
||||
if(usr.hand)
|
||||
I = usr.l_hand
|
||||
else if(!usr.hand)
|
||||
I = usr.r_hand
|
||||
|
||||
var/obj/item/I = get_active_hand()
|
||||
|
||||
if(!I)
|
||||
to_chat(usr, "<span class='warning'> You don't have anything in your hand to give to [target.name]</span>")
|
||||
return
|
||||
if((I.flags & NODROP) || (I.flags & ABSTRACT))
|
||||
to_chat(usr, "<span class='notice'>That's not exactly something you can give.</span>")
|
||||
@@ -29,35 +22,30 @@
|
||||
if("Yes")
|
||||
if(!I)
|
||||
return
|
||||
if(target.incapacitated() || usr.incapacitated())
|
||||
return
|
||||
if(!Adjacent(target))
|
||||
to_chat(usr, "<span class='warning'> You need to stay in reaching distance while giving an object.</span>")
|
||||
to_chat(target, "<span class='warning'> [usr.name] moved too far away.</span>")
|
||||
return
|
||||
if((usr.hand && usr.l_hand != I) || (!usr.hand && usr.r_hand != I))
|
||||
if((I.flags & NODROP) || (I.flags & ABSTRACT))
|
||||
to_chat(usr, "<span class='warning'>[I] stays stuck to your hand when you try to give it!</span>")
|
||||
to_chat(target, "<span class='warning'>[I] stays stuck to [usr.name]'s hand when you try to take it!</span>")
|
||||
return
|
||||
if(I != get_active_hand())
|
||||
to_chat(usr, "<span class='warning'> You need to keep the item in your active hand.</span>")
|
||||
to_chat(target, "<span class='warning'> [usr.name] seem to have given up on giving \the [I.name] to you.</span>")
|
||||
to_chat(target, "<span class='warning'> [usr.name] seem to have given up on giving [I] to you.</span>")
|
||||
return
|
||||
if(target.r_hand != null && target.l_hand != null)
|
||||
to_chat(target, "<span class='warning'> Your hands are full.</span>")
|
||||
to_chat(usr, "<span class='warning'> Their hands are full.</span>")
|
||||
return
|
||||
else
|
||||
usr.drop_item()
|
||||
if(target.r_hand == null)
|
||||
target.r_hand = I
|
||||
else
|
||||
target.l_hand = I
|
||||
I.loc = target
|
||||
I.layer = 20
|
||||
I.plane = HUD_PLANE
|
||||
usr.unEquip(I)
|
||||
target.put_in_hands(I)
|
||||
I.add_fingerprint(target)
|
||||
src.update_inv_l_hand()
|
||||
src.update_inv_r_hand()
|
||||
target.update_inv_l_hand()
|
||||
target.update_inv_r_hand()
|
||||
target.visible_message("<span class='notice'> [usr.name] handed \the [I.name] to [target.name].</span>")
|
||||
target.visible_message("<span class='notice'> [usr.name] handed [I] to [target.name].</span>")
|
||||
I.on_give(usr, target)
|
||||
if("No")
|
||||
target.visible_message("<span class='warning'> [usr.name] tried to hand [I.name] to [target.name] but [target.name] didn't want it.</span>")
|
||||
target.visible_message("<span class='warning'> [usr.name] tried to hand [I] to [target.name] but [target.name] didn't want it.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'> [target.name]'s hands are full.</span>")
|
||||
|
||||
@@ -172,6 +172,7 @@
|
||||
// Defined here solely to take species flags into account without having to recast at mob/living level.
|
||||
/mob/living/carbon/human/adjustOxyLoss(amount)
|
||||
if(NO_BREATHE in dna.species.species_traits)
|
||||
oxyloss = 0
|
||||
return FALSE
|
||||
if(dna.species && amount > 0)
|
||||
amount = amount * dna.species.oxy_mod
|
||||
@@ -179,6 +180,7 @@
|
||||
|
||||
/mob/living/carbon/human/setOxyLoss(amount)
|
||||
if(NO_BREATHE in dna.species.species_traits)
|
||||
oxyloss = 0
|
||||
return FALSE
|
||||
if(dna.species && amount > 0)
|
||||
amount = amount * dna.species.oxy_mod
|
||||
|
||||
@@ -434,11 +434,11 @@
|
||||
if(slot_l_hand)
|
||||
if(l_hand)
|
||||
return 0
|
||||
return 1
|
||||
return !incapacitated()
|
||||
if(slot_r_hand)
|
||||
if(r_hand)
|
||||
return 0
|
||||
return 1
|
||||
return !incapacitated()
|
||||
if(slot_wear_mask)
|
||||
if(wear_mask)
|
||||
return 0
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/mob/living/carbon/human/SetLoseBreath(amount)
|
||||
if(NO_BREATHE in dna.species.species_traits)
|
||||
losebreath = 0
|
||||
return FALSE
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -122,8 +122,10 @@
|
||||
|
||||
/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE)
|
||||
if(status_flags & GODMODE)
|
||||
oxyloss = 0
|
||||
return FALSE //godmode
|
||||
if(BREATHLESS in mutations)
|
||||
oxyloss = 0
|
||||
return FALSE
|
||||
var/old_oxyloss = oxyloss
|
||||
oxyloss = max(oxyloss + amount, 0)
|
||||
@@ -137,8 +139,10 @@
|
||||
|
||||
/mob/living/proc/setOxyLoss(amount, updating_health = TRUE)
|
||||
if(status_flags & GODMODE)
|
||||
oxyloss = 0
|
||||
return FALSE //godmode
|
||||
if(BREATHLESS in mutations)
|
||||
oxyloss = 0
|
||||
return FALSE
|
||||
var/old_oxyloss = oxyloss
|
||||
oxyloss = amount
|
||||
|
||||
@@ -759,7 +759,7 @@
|
||||
if(!silent)
|
||||
visible_message("<span class='notice'>[src] tries to put [what] on [who].</span>")
|
||||
if(do_mob(src, who, what.put_on_delay))
|
||||
if(what && Adjacent(who))
|
||||
if(what && Adjacent(who) && !(what.flags & NODROP))
|
||||
unEquip(what)
|
||||
who.equip_to_slot_if_possible(what, where, 0, 1)
|
||||
add_attack_logs(src, who, "Equipped [what]")
|
||||
|
||||
@@ -429,6 +429,7 @@
|
||||
modules += new /obj/item/bonesetter(src)
|
||||
modules += new /obj/item/surgicaldrill(src)
|
||||
modules += new /obj/item/gripper/medical(src)
|
||||
modules += new /obj/item/gun/medbeam(src)
|
||||
modules += new /obj/item/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
|
||||
modules += new /obj/item/card/emag(src)
|
||||
modules += new /obj/item/crowbar/cyborg(src)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees
|
||||
name = "bee"
|
||||
desc = "buzzy buzzy bee, stingy sti- Ouch!"
|
||||
desc = "Buzzy buzzy bee, stingy sti- Ouch!"
|
||||
icon_state = ""
|
||||
icon_living = ""
|
||||
icon = 'icons/mob/bees.dmi'
|
||||
@@ -33,25 +33,28 @@
|
||||
environment_smash = 0
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
flying = 1
|
||||
search_objects = 1 //have to find those plant trays!
|
||||
density = 0
|
||||
density = FALSE
|
||||
mob_size = MOB_SIZE_TINY
|
||||
flying = TRUE
|
||||
search_objects = TRUE //have to find those plant trays!
|
||||
|
||||
//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)
|
||||
minbodytemp = 0
|
||||
del_on_death = 1
|
||||
del_on_death = TRUE
|
||||
|
||||
var/datum/reagent/beegent = null //hehe, beegent
|
||||
var/obj/structure/beebox/beehome = null
|
||||
var/isqueen = FALSE
|
||||
var/idle = 0
|
||||
var/isqueen = FALSE
|
||||
var/bee_syndicate = FALSE
|
||||
var/icon_base = "bee"
|
||||
var/static/list/bee_icons = list()
|
||||
var/static/beehometypecache = typecacheof(/obj/structure/beebox)
|
||||
var/static/hydroponicstypecache = typecacheof(/obj/machinery/hydroponics)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/New()
|
||||
..()
|
||||
@@ -65,6 +68,20 @@
|
||||
beehome = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/death(gibbed)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(beehome)
|
||||
if(beehome.bees)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/examine(mob/user)
|
||||
..()
|
||||
if(!bee_syndicate && !beehome)
|
||||
to_chat(user, "<span class='warning'>This bee is homeless!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals()
|
||||
overlays.Cut()
|
||||
|
||||
@@ -94,21 +111,45 @@
|
||||
//We don't attack beekeepers/people dressed as bees//Todo: bee costume
|
||||
/mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
return .
|
||||
if(!.)
|
||||
return FALSE
|
||||
if(!bee_syndicate && isliving(the_target))
|
||||
var/mob/living/H = the_target
|
||||
return !H.bee_friendly()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/Found(atom/A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
return !L.bee_friendly()
|
||||
return 0
|
||||
var/mob/living/H = A
|
||||
return !H.bee_friendly()
|
||||
if(istype(A, /obj/machinery/hydroponics))
|
||||
var/obj/machinery/hydroponics/Hydro = A
|
||||
if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit)
|
||||
wanted_objects |= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/AttackingTarget()
|
||||
if(beegent && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(!isnull(target.reagents))
|
||||
beegent.reaction_mob(L, INGEST)
|
||||
L.reagents.add_reagent(beegent.id, rand(1,5))
|
||||
target.attack_animal(src)
|
||||
//Pollinate
|
||||
if(istype(target, /obj/machinery/hydroponics))
|
||||
var/obj/machinery/hydroponics/Hydro = target
|
||||
pollinate(Hydro)
|
||||
else if(istype(target, /obj/structure/beebox))
|
||||
if(target == beehome)
|
||||
var/obj/structure/beebox/BB = target
|
||||
forceMove(BB)
|
||||
target = null
|
||||
wanted_objects -= beehometypecache //so we don't attack beeboxes when not going home
|
||||
return //no don't attack the goddamm box
|
||||
else
|
||||
..()
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.reagents)
|
||||
if(beegent)
|
||||
beegent.reaction_mob(L, INGEST)
|
||||
L.reagents.add_reagent(beegent.id, rand(1, 5))
|
||||
else
|
||||
L.reagents.add_reagent("spidertoxin", 5)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R)
|
||||
if(istype(R))
|
||||
@@ -116,81 +157,13 @@
|
||||
name = "[initial(name)] ([R.name])"
|
||||
generate_bee_visuals()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/handle_automated_action()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B)
|
||||
if(!B)
|
||||
return 0
|
||||
if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
//Botany Worker Bees
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker
|
||||
//Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/Destroy()
|
||||
if(beehome)
|
||||
if(beehome.bees)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(beehome)
|
||||
if(beehome.bees)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user)
|
||||
..()
|
||||
|
||||
if(!beehome)
|
||||
to_chat(user, "<span class='warning'>This bee is homeless!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A)
|
||||
if(istype(A, /obj/machinery/hydroponics))
|
||||
var/obj/machinery/hydroponics/Hydro = A
|
||||
if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.lid_state)
|
||||
wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
|
||||
return 1
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case
|
||||
var/mob/living/L = the_target
|
||||
return !L.bee_friendly()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/AttackingTarget()
|
||||
//Pollinate
|
||||
if(istype(target, /obj/machinery/hydroponics))
|
||||
var/obj/machinery/hydroponics/Hydro = target
|
||||
pollinate(Hydro)
|
||||
else if(target == beehome)
|
||||
var/obj/structure/beebox/BB = target
|
||||
forceMove(BB)
|
||||
target = null
|
||||
wanted_objects -= /obj/structure/beebox //so we don't attack beeboxes when not going home
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/hydroponics/Hydro)
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/hydroponics/Hydro)
|
||||
if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_state)
|
||||
target = null
|
||||
return
|
||||
|
||||
target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity
|
||||
wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
|
||||
wanted_objects -= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted
|
||||
Hydro.recent_bee_visit = TRUE
|
||||
spawn(BEE_TRAY_RECENT_VISIT)
|
||||
if(Hydro)
|
||||
@@ -210,68 +183,79 @@
|
||||
if(beehome)
|
||||
beehome.bee_resources = min(beehome.bee_resources + growth, 100)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/handle_automated_action()
|
||||
/mob/living/simple_animal/hostile/poison/bees/handle_automated_action()
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(!isqueen)
|
||||
if(loc == beehome)
|
||||
idle = min(100, ++idle)
|
||||
if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM))
|
||||
forceMove(get_turf(beehome))
|
||||
else
|
||||
idle = max(0, --idle)
|
||||
if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME))
|
||||
if(!FindTarget())
|
||||
wanted_objects += /obj/structure/beebox //so we don't attack beeboxes when not going home
|
||||
target = beehome
|
||||
if(!beehome) //add outselves to a beebox (of the same reagent) if we have no home
|
||||
for(var/obj/structure/beebox/BB in view(vision_range, src))
|
||||
if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees())
|
||||
continue
|
||||
BB.bees |= src
|
||||
beehome = BB
|
||||
|
||||
|
||||
if(!bee_syndicate)
|
||||
if(!isqueen)
|
||||
if(loc == beehome)
|
||||
idle = min(100, ++idle)
|
||||
if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM))
|
||||
forceMove(beehome.drop_location())
|
||||
else
|
||||
idle = max(0, --idle)
|
||||
if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME))
|
||||
if(!FindTarget())
|
||||
wanted_objects |= beehometypecache //so we don't attack beeboxes when not going home
|
||||
target = beehome
|
||||
if(!beehome) //add ourselves to a beebox (of the same reagent) if we have no home
|
||||
for(var/obj/structure/beebox/BB in view(vision_range, src))
|
||||
if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees())
|
||||
continue
|
||||
BB.bees |= src
|
||||
beehome = BB
|
||||
break // End loop after the first compatible find.
|
||||
|
||||
//Botany Queen Bee
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen
|
||||
name = "queen bee"
|
||||
desc = "she's the queen of bees, BZZ BZZ"
|
||||
desc = "She's the queen of bees, BZZ BZZ"
|
||||
icon_base = "queen"
|
||||
isqueen = TRUE
|
||||
|
||||
|
||||
//the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself
|
||||
//the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
//leave pollination for the peasent bees
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget()
|
||||
..()
|
||||
if(beegent && isliving(target))
|
||||
var/mob/living/L = target
|
||||
beegent.reaction_mob(L, TOUCH)
|
||||
L.reagents.add_reagent(beegent.id, rand(1, 5))
|
||||
|
||||
//PEASENT BEES
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/pollinate()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B)
|
||||
if(!B)
|
||||
return FALSE
|
||||
if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && !beegent || !B.beegent && beegent)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/queen/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
if(isliving(the_target)) //Should ignore ghosts and camera mobs already, but just in case
|
||||
var/mob/living/L = the_target
|
||||
return !L.bee_friendly()
|
||||
|
||||
/obj/item/queen_bee
|
||||
name = "queen bee"
|
||||
desc = "she's the queen of bees, BZZ BZZ"
|
||||
desc = "She's the queen of bees, BZZ BZZ"
|
||||
icon_state = "queen_item"
|
||||
item_state = ""
|
||||
icon = 'icons/mob/bees.dmi'
|
||||
var/mob/living/simple_animal/hostile/poison/bees/queen/queen
|
||||
|
||||
|
||||
/obj/item/queen_bee/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I,/obj/item/reagent_containers/syringe))
|
||||
if(istype(I, /obj/item/reagent_containers/syringe))
|
||||
var/obj/item/reagent_containers/syringe/S = I
|
||||
if(S.reagents.has_reagent("royal_bee_jelly")) //checked twice, because I really don't want royal bee jelly to be duped
|
||||
if(S.reagents.has_reagent("royal_bee_jelly",5))
|
||||
if(S.reagents.has_reagent("royal_bee_jelly", 5))
|
||||
S.reagents.remove_reagent("royal_bee_jelly", 5)
|
||||
if(!queen.beegent.can_synth)
|
||||
to_chat(user, "<span class='warning'>You inject [src] with the royal bee jelly. It's ineffective! Maybe it's something to do with the [src] reagent.</span>")
|
||||
return
|
||||
var/obj/item/queen_bee/qb = new(get_turf(user))
|
||||
var/obj/item/queen_bee/qb = new(user.drop_location())
|
||||
qb.queen = new(qb)
|
||||
if(queen && queen.beegent)
|
||||
qb.queen.assign_reagent(queen.beegent) //Bees use the global singleton instances of reagents, so we don't need to worry about one bee being deleted and her copies losing their reagents.
|
||||
@@ -282,16 +266,17 @@
|
||||
else
|
||||
var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()]
|
||||
if(R && S.reagents.has_reagent(R.id, 5))
|
||||
S.reagents.remove_reagent(R.id,5)
|
||||
S.reagents.remove_reagent(R.id, 5)
|
||||
queen.assign_reagent(R)
|
||||
user.visible_message("<span class='warning'>[user] injects [src]'s genome with [R.name], mutating it's DNA!</span>","<span class='warning'>You inject [src]'s genome with [R.name], mutating it's DNA!</span>")
|
||||
user.visible_message("<span class='warning'>[user] injects [src]'s genome with [R.name], mutating its DNA!</span>", "<span class='warning'>You inject [src]'s genome with [R.name], mutating its DNA!</span>")
|
||||
name = queen.name
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You don't have enough units of that chemical to modify the bee's DNA!</span>")
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/queen_bee/bought/New()
|
||||
..()
|
||||
/obj/item/queen_bee/bought/Initialize(mapload)
|
||||
. = ..()
|
||||
queen = new(src)
|
||||
|
||||
/obj/item/queen_bee/Destroy()
|
||||
@@ -299,7 +284,6 @@
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
//Syndicate Bees
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi
|
||||
name = "syndi-bee"
|
||||
@@ -309,10 +293,14 @@
|
||||
maxHealth = 25
|
||||
health = 25
|
||||
faction = list("hostile", "syndicate")
|
||||
search_objects = 0 //these bees don't care about trivial things like plants, especially when there is havoc to sow
|
||||
beegent = new /datum/reagent/facid() //prepare to die
|
||||
search_objects = FALSE //these bees don't care about trivial things like plants, especially when there is havoc to sow
|
||||
bee_syndicate = TRUE
|
||||
var/list/master_and_friends = list()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/New()
|
||||
beegent = GLOB.chemical_reagents_list["facid"] //Prepare to die
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/Destroy()
|
||||
master_and_friends.Cut()
|
||||
return ..()
|
||||
@@ -320,24 +308,27 @@
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/assign_reagent(datum/reagent/R)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A)
|
||||
return CanAttack(A)
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/pollinate() // No Pollination
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/Found(atom/A) //Typical usual hostile mob targeting list
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/CanAttack(atom/the_target)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return 0
|
||||
return FALSE
|
||||
if(isliving(the_target))
|
||||
var/mob/living/L = the_target
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H in master_and_friends)
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/syndi/AttackingTarget()
|
||||
..()
|
||||
if(target && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.stat)
|
||||
LoseTarget()
|
||||
LoseTarget()
|
||||
@@ -58,6 +58,7 @@
|
||||
if(!targets_from)
|
||||
targets_from = src
|
||||
environment_target_typecache = typecacheof(environment_target_typecache)
|
||||
wanted_objects = typecacheof(wanted_objects)
|
||||
|
||||
/mob/living/simple_animal/hostile/Destroy()
|
||||
targets_from = null
|
||||
|
||||
@@ -298,6 +298,7 @@
|
||||
|
||||
/mob/living/SetLoseBreath(amount)
|
||||
if(BREATHLESS in mutations)
|
||||
losebreath = 0
|
||||
return FALSE
|
||||
losebreath = max(amount, 0)
|
||||
|
||||
|
||||
@@ -54,8 +54,8 @@
|
||||
feedback_add_details("gun_fired","[type]")
|
||||
|
||||
/obj/item/gun/medbeam/process()
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(!istype(H))
|
||||
var/source = loc
|
||||
if(!ishuman(source) && !isrobot(source))
|
||||
LoseTarget()
|
||||
return
|
||||
|
||||
@@ -68,9 +68,9 @@
|
||||
|
||||
last_check = world.time
|
||||
|
||||
if(get_dist(H,current_target)>max_range || !los_check(H,current_target))
|
||||
if(get_dist(source,current_target)>max_range || !los_check(source,current_target))
|
||||
LoseTarget()
|
||||
to_chat(H, "<span class='warning'>You lose control of the beam!</span>")
|
||||
to_chat(source, "<span class='warning'>You lose control of the beam!</span>")
|
||||
return
|
||||
|
||||
if(current_target)
|
||||
|
||||
@@ -465,8 +465,8 @@ var/const/INGEST = 2
|
||||
add_reagent(S, C.result_amount * C.secondary_results[S] * multiplier)
|
||||
|
||||
var/list/seen = viewers(4, get_turf(my_atom))
|
||||
for(var/mob/M in seen)
|
||||
if(!C.no_message)
|
||||
for(var/mob/living/M in seen)
|
||||
if(C.mix_message)
|
||||
to_chat(M, "<span class='notice'>[bicon(my_atom)] [C.mix_message]</span>")
|
||||
|
||||
if(istype(my_atom, /obj/item/slime_extract))
|
||||
@@ -478,7 +478,8 @@ var/const/INGEST = 2
|
||||
ME2.name = "used slime extract"
|
||||
ME2.desc = "This extract has been used up."
|
||||
|
||||
playsound(get_turf(my_atom), C.mix_sound, 80, 1)
|
||||
if(C.mix_sound)
|
||||
playsound(get_turf(my_atom), C.mix_sound, 80, 1)
|
||||
|
||||
C.on_reaction(src, created_volume)
|
||||
reaction_occured = 1
|
||||
|
||||
@@ -262,12 +262,6 @@
|
||||
T.create_reagents(50)
|
||||
T.reagents.add_reagent("sorium", 5)
|
||||
|
||||
/datum/reagent/sorium_vortex
|
||||
name = "sorium_vortex"
|
||||
id = "sorium_vortex"
|
||||
reagent_state = LIQUID
|
||||
color = "#FFA500"
|
||||
|
||||
/datum/reagent/liquid_dark_matter
|
||||
name = "Liquid Dark Matter"
|
||||
id = "liquid_dark_matter"
|
||||
@@ -285,12 +279,6 @@
|
||||
T.create_reagents(50)
|
||||
T.reagents.add_reagent("liquid_dark_matter", 5)
|
||||
|
||||
/datum/reagent/ldm_vortex
|
||||
name = "LDM Vortex"
|
||||
id = "ldm_vortex"
|
||||
reagent_state = LIQUID
|
||||
color = "#800080"
|
||||
|
||||
/datum/reagent/blackpowder
|
||||
name = "Black Powder"
|
||||
id = "blackpowder"
|
||||
|
||||
@@ -1049,6 +1049,11 @@
|
||||
update_flags |= M.adjustToxLoss(1, FALSE)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/pestkiller/reaction_obj(obj/O, volume)
|
||||
if(istype(O, /obj/effect/decal/ants))
|
||||
O.visible_message("<span class='warning'>The ants die.</span>")
|
||||
qdel(O)
|
||||
|
||||
/datum/reagent/pestkiller/reaction_mob(mob/living/M, method=TOUCH, volume)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
|
||||
@@ -11,13 +11,11 @@
|
||||
var/required_other = 0 // an integer required for the reaction to happen
|
||||
|
||||
var/result_amount = 0
|
||||
var/secondary = 0 // set to nonzero if secondary reaction
|
||||
var/list/secondary_results = list() //additional reagents produced by the reaction
|
||||
var/min_temp = 0 //Minimum temperature required for the reaction to occur (heat to/above this). min_temp = 0 means no requirement
|
||||
var/max_temp = 9999 //Maximum temperature allowed for the reaction to occur (cool to/below this).
|
||||
var/mix_message = "The solution begins to bubble."
|
||||
var/mix_sound = 'sound/effects/bubbles.ogg'
|
||||
var/no_message = 0
|
||||
|
||||
/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume)
|
||||
return
|
||||
|
||||
@@ -89,55 +89,59 @@
|
||||
name = "Sorium"
|
||||
id = "sorium"
|
||||
result = "sorium"
|
||||
required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1)
|
||||
required_reagents = list("mercury" = 1, "carbon" = 1, "nitrogen" = 1, "oxygen" = 1, "stabilizing_agent" = 1)
|
||||
result_amount = 4
|
||||
mix_message = "The mixture pops and crackles before settling down."
|
||||
|
||||
/datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, created_volume)
|
||||
if(holder.has_reagent("stabilizing_agent"))
|
||||
/datum/chemical_reaction/sorium_explosion
|
||||
name = "Sorium Explosion"
|
||||
id = "sorium_explosion"
|
||||
required_reagents = list("mercury" = 1, "carbon" = 1, "nitrogen" = 1, "oxygen" = 1)
|
||||
result_amount = 1
|
||||
mix_message = "The mixture explodes with a big bang."
|
||||
|
||||
/datum/chemical_reaction/sorium_explosion/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
if(!T)
|
||||
return
|
||||
var/turf/simulated/T = get_turf(holder.my_atom)
|
||||
goonchem_vortex(T, 0, created_volume)
|
||||
holder.remove_reagent("sorium", created_volume)
|
||||
|
||||
/datum/chemical_reaction/sorium_vortex
|
||||
/datum/chemical_reaction/sorium_explosion/sorium
|
||||
name = "sorium_vortex"
|
||||
id = "sorium_vortex"
|
||||
result = "sorium_vortex"
|
||||
required_reagents = list("sorium" = 1)
|
||||
result_amount = 1
|
||||
min_temp = T0C + 200
|
||||
|
||||
/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/turf/simulated/T = get_turf(holder.my_atom)
|
||||
goonchem_vortex(T, 0, created_volume)
|
||||
holder.remove_reagent("sorium_vortex", created_volume)
|
||||
mix_sound = null
|
||||
mix_message = null
|
||||
|
||||
/datum/chemical_reaction/liquid_dark_matter
|
||||
name = "Liquid Dark Matter"
|
||||
id = "liquid_dark_matter"
|
||||
result = "liquid_dark_matter"
|
||||
required_reagents = list("plasma" = 1, "radium" = 1, "carbon" = 1, "stabilizing_agent" = 1)
|
||||
result_amount = 4
|
||||
mix_message = "The mixture begins to glow in a dark purple."
|
||||
|
||||
/datum/chemical_reaction/ldm_implosion
|
||||
name = "Implosion"
|
||||
id = "implosion"
|
||||
required_reagents = list("plasma" = 1, "radium" = 1, "carbon" = 1)
|
||||
result_amount = 3
|
||||
result_amount = 1
|
||||
mix_message = "The mixture implodes suddenly."
|
||||
|
||||
/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume)
|
||||
if(holder.has_reagent("stabilizing_agent"))
|
||||
return
|
||||
/datum/chemical_reaction/ldm_implosion/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/turf/simulated/T = get_turf(holder.my_atom)
|
||||
if(!T)
|
||||
return
|
||||
goonchem_vortex(T, 1, created_volume)
|
||||
holder.remove_reagent("liquid_dark_matter", created_volume)
|
||||
|
||||
/datum/chemical_reaction/ldm_vortex
|
||||
/datum/chemical_reaction/ldm_implosion/liquid_dark_matter
|
||||
name = "LDM Vortex"
|
||||
id = "ldm_vortex"
|
||||
result = "ldm_vortex"
|
||||
required_reagents = list("liquid_dark_matter" = 1)
|
||||
result_amount = 1
|
||||
min_temp = T0C + 200
|
||||
|
||||
/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/turf/simulated/T = get_turf(holder.my_atom)
|
||||
goonchem_vortex(T, 1, created_volume)
|
||||
holder.remove_reagent("ldm_vortex", created_volume)
|
||||
mix_sound = null
|
||||
mix_message = null
|
||||
|
||||
/datum/chemical_reaction/blackpowder
|
||||
name = "Black Powder"
|
||||
@@ -154,7 +158,7 @@
|
||||
required_reagents = list("blackpowder" = 1)
|
||||
result_amount = 1
|
||||
min_temp = T0C + 200
|
||||
no_message = 1
|
||||
mix_message = null
|
||||
mix_sound = null
|
||||
|
||||
/datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume)
|
||||
@@ -175,42 +179,35 @@
|
||||
spawn(0)
|
||||
qdel(holder.my_atom)
|
||||
|
||||
datum/chemical_reaction/flash_powder
|
||||
/datum/chemical_reaction/flash_powder
|
||||
name = "Flash powder"
|
||||
id = "flash_powder"
|
||||
result = "flash_powder"
|
||||
required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1)
|
||||
result_amount = 3
|
||||
required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1, "stabilizing_agent" = 1)
|
||||
result_amount = 5
|
||||
mix_message = "The chemicals hiss and fizz briefly before falling still."
|
||||
|
||||
/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume)
|
||||
if(holder.has_reagent("stabilizing_agent"))
|
||||
return
|
||||
var/location = get_turf(holder.my_atom)
|
||||
do_sparks(2, 1, location)
|
||||
for(var/mob/living/carbon/C in viewers(5, location))
|
||||
if(C.flash_eyes())
|
||||
if(get_dist(C, location) < 4)
|
||||
C.Weaken(5)
|
||||
continue
|
||||
C.Stun(5)
|
||||
holder.remove_reagent("flash_powder", created_volume)
|
||||
|
||||
/datum/chemical_reaction/flash_powder_flash
|
||||
name = "Flash powder activation"
|
||||
id = "flash_powder_flash"
|
||||
/datum/chemical_reaction/flash
|
||||
name = "Flash"
|
||||
id = "flash"
|
||||
result = null
|
||||
required_reagents = list("aluminum" = 1, "potassium" = 1, "sulfur" = 1, "chlorine" = 1)
|
||||
mix_message = "The chemicals catch fire, burning brightly and violently!"
|
||||
mix_sound = 'sound/effects/bang.ogg'
|
||||
|
||||
/datum/chemical_reaction/flash/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
if(!location)
|
||||
return
|
||||
do_sparks(2, 1, location)
|
||||
bang(location, holder.my_atom, 5, flash = TRUE, bang = FALSE)
|
||||
|
||||
/datum/chemical_reaction/flash/flash_powder
|
||||
name = "flash_powder_flash"
|
||||
id = "flash_powder_flash"
|
||||
required_reagents = list("flash_powder" = 1)
|
||||
min_temp = T0C + 100
|
||||
|
||||
/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
do_sparks(2, 1, location)
|
||||
for(var/mob/living/carbon/C in viewers(5, location))
|
||||
if(C.flash_eyes())
|
||||
if(get_dist(C, location) < 4)
|
||||
C.Weaken(5)
|
||||
continue
|
||||
C.Stun(5)
|
||||
mix_message = null
|
||||
|
||||
/datum/chemical_reaction/phlogiston
|
||||
name = "Phlogiston"
|
||||
@@ -250,7 +247,7 @@ datum/chemical_reaction/flash_powder
|
||||
name = "smoke_powder"
|
||||
id = "smoke_powder"
|
||||
result = "smoke_powder"
|
||||
required_reagents = list("stabilizing_agent" = 1, "potassium" = 1, "sugar" = 1, "phosphorus" = 1)
|
||||
required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1, "stabilizing_agent" = 1)
|
||||
result_amount = 3
|
||||
mix_message = "The mixture sets into a greyish powder!"
|
||||
|
||||
@@ -285,7 +282,6 @@ datum/chemical_reaction/flash_powder
|
||||
id = "smoke_powder_smoke"
|
||||
required_reagents = list("smoke_powder" = 1)
|
||||
min_temp = T0C + 100
|
||||
secondary = 1
|
||||
result_amount = 1
|
||||
forbidden_reagents = list("stimulants")
|
||||
mix_sound = null
|
||||
@@ -294,78 +290,30 @@ datum/chemical_reaction/flash_powder
|
||||
name = "sonic_powder"
|
||||
id = "sonic_powder"
|
||||
result = "sonic_powder"
|
||||
required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1, "stabilizing_agent" = 1)
|
||||
result_amount = 2
|
||||
mix_message = "The mixture begins to bubble slighly!"
|
||||
|
||||
/datum/chemical_reaction/sonic_deafen
|
||||
name = "sonic_deafen"
|
||||
id = "sonic_deafen"
|
||||
result = null
|
||||
required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1)
|
||||
result_amount = 3
|
||||
mix_message = "The mixture begins to bubble furiously!"
|
||||
mix_sound = 'sound/effects/bang.ogg'
|
||||
|
||||
/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume)
|
||||
if(holder.has_reagent("stabilizing_agent"))
|
||||
return
|
||||
/datum/chemical_reaction/sonic_deafen/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
playsound(location, 'sound/effects/bang.ogg', 25, 1)
|
||||
for(var/mob/living/M in hearers(5, location))
|
||||
var/ear_safety = 0
|
||||
var/distance = max(1,get_dist(src,T))
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT)))
|
||||
ear_safety++
|
||||
to_chat(C, "<span class='warning'>BANG</span>")
|
||||
if(!ear_safety)
|
||||
M.Stun(max(10/distance, 3))
|
||||
M.Weaken(max(10/distance, 3))
|
||||
M.AdjustEarDamage(rand(0, 5), 15)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears)
|
||||
if(istype(ears))
|
||||
if(ears.ear_damage >= 15)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(ears.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(ears.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
holder.remove_reagent("sonic_powder", created_volume)
|
||||
if(!location)
|
||||
return
|
||||
bang(location, holder.my_atom, 5, flash = FALSE, bang = TRUE)
|
||||
|
||||
/datum/chemical_reaction/sonic_powder_deafen
|
||||
/datum/chemical_reaction/sonic_deafen/sonic_powder
|
||||
name = "sonic_powder_deafen"
|
||||
id = "sonic_powder_deafen"
|
||||
result = null
|
||||
required_reagents = list("sonic_powder" = 1)
|
||||
min_temp = T0C + 100
|
||||
|
||||
/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
playsound(location, 'sound/effects/bang.ogg', 25, 1)
|
||||
for(var/mob/living/M in hearers(5, location))
|
||||
var/ear_safety = 0
|
||||
var/distance = max(1,get_dist(src,T))
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT)))
|
||||
ear_safety++
|
||||
to_chat(M, "<span class='warning'>BANG</span>")
|
||||
if(!ear_safety)
|
||||
M.Stun(max(10/distance, 3))
|
||||
M.Weaken(max(10/distance, 3))
|
||||
M.AdjustEarDamage(rand(0, 5), 15)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
var/obj/item/organ/internal/ears/ears = C.get_int_organ(/obj/item/organ/internal/ears)
|
||||
if(istype(ears))
|
||||
if(ears.ear_damage >= 15)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring badly!</span>")
|
||||
if(prob(ears.ear_damage - 5))
|
||||
to_chat(M, "<span class='warning'>You can't hear anything!</span>")
|
||||
M.BecomeDeaf()
|
||||
else
|
||||
if(ears.ear_damage >= 5)
|
||||
to_chat(M, "<span class='warning'>Your ears start to ring!</span>")
|
||||
mix_message = null
|
||||
|
||||
/datum/chemical_reaction/cryostylane
|
||||
name = "cryostylane"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
result_amount = 1
|
||||
min_temp = T0C + 400
|
||||
mix_sound = null
|
||||
no_message = 1
|
||||
mix_message = null
|
||||
|
||||
/datum/chemical_reaction/cyanide
|
||||
name = "Cyanide"
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
to_chat(user, "<span class='warning'>You cannot fill [target] while it is sealed.</span>")
|
||||
return
|
||||
|
||||
else if(istype(target, /obj/effect/decal/cleanable)) //stops splashing while scooping up fluids
|
||||
else if(istype(target, /obj/effect/decal)) //stops splashing while scooping up fluids
|
||||
return
|
||||
|
||||
else if(reagents.total_volume)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
volume = 100
|
||||
consume_sound = null
|
||||
taste = FALSE
|
||||
antable = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/pill/New()
|
||||
..()
|
||||
|
||||
@@ -177,7 +177,9 @@
|
||||
var/obj/structure/closet/crate/O = target
|
||||
if(O.opened)
|
||||
return
|
||||
if(use(3))
|
||||
if(amount >= 3 && do_after_once(user, 15, target = target))
|
||||
if(O.opened || !use(3))
|
||||
return
|
||||
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
|
||||
P.icon_state = "deliverycrate"
|
||||
P.wrapped = O
|
||||
@@ -189,7 +191,9 @@
|
||||
var/obj/structure/closet/O = target
|
||||
if(O.opened)
|
||||
return
|
||||
if(use(3))
|
||||
if(amount >= 3 && do_after_once(user, 15, target = target))
|
||||
if(O.opened || !use(3))
|
||||
return
|
||||
var/obj/structure/bigDelivery/P = new /obj/structure/bigDelivery(get_turf(O.loc))
|
||||
P.wrapped = O
|
||||
P.init_welded = O.welded
|
||||
|
||||
@@ -18,23 +18,11 @@
|
||||
|
||||
// Takes care blood loss and regeneration
|
||||
/mob/living/carbon/human/handle_blood()
|
||||
var/list/blood_data = get_blood_data(get_blood_id())//PROCCEPTION
|
||||
|
||||
if(NO_BLOOD in dna.species.species_traits)
|
||||
bleed_rate = 0
|
||||
return
|
||||
|
||||
if(bodytemperature >= 225 && !(NOCLONE in mutations)) //cryosleep or husked people do not pump the blood.
|
||||
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < max_blood && blood_volume)
|
||||
if(mind) //Handles vampires "eating" blood that isn't their own.
|
||||
if(mind in ticker.mode.vampires)
|
||||
if(nutrition >= NUTRITION_LEVEL_WELL_FED)
|
||||
return //We don't want blood tranfusions making vampires fat.
|
||||
if(blood_data["donor"] != src)
|
||||
nutrition += (15 * REAGENTS_METABOLISM)
|
||||
return //Only process one blood per tick, to maintain the same metabolism as nutriment for non-vampires.
|
||||
if(blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
blood_volume += 0.1 // regenerate blood VERY slowly
|
||||
|
||||
@@ -56,7 +44,7 @@
|
||||
if(prob(15))
|
||||
Paralyse(rand(1,3))
|
||||
to_chat(src, "<span class='warning'>You feel extremely [word].</span>")
|
||||
if(0 to BLOOD_VOLUME_SURVIVE)
|
||||
if(-INFINITY to BLOOD_VOLUME_SURVIVE)
|
||||
death()
|
||||
|
||||
var/temp_bleed = 0
|
||||
|
||||
Reference in New Issue
Block a user