mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 03:33:21 +00:00
Merge remote-tracking branch 'remotes/git-svn' tgstation r4838 into bs12_with_tgport
Conflicts: code/game/gamemodes/events.dm code/game/gamemodes/events/space_ninja.dm code/game/machinery/atmo_control.dm code/game/machinery/doors/firedoor.dm code/game/machinery/telecomms/broadcaster.dm code/game/objects/structures/watercloset.dm code/modules/clothing/glasses/glasses.dm code/modules/mob/living/carbon/human/human.dm code/modules/mob/living/simple_animal/life.dm code/modules/mob/new_player/new_player.dm Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
var/name = "Unknown Laws"
|
var/name = "Unknown Laws"
|
||||||
var/randomly_selectable = 0
|
var/randomly_selectable = 0
|
||||||
var/zeroth = null
|
var/zeroth = null
|
||||||
|
var/zeroth_borg = null
|
||||||
var/list/inherent = list()
|
var/list/inherent = list()
|
||||||
var/list/supplied = list()
|
var/list/supplied = list()
|
||||||
var/list/ion = list()
|
var/list/ion = list()
|
||||||
@@ -79,8 +80,10 @@
|
|||||||
|
|
||||||
/* General ai_law functions */
|
/* General ai_law functions */
|
||||||
|
|
||||||
/datum/ai_laws/proc/set_zeroth_law(var/law)
|
/datum/ai_laws/proc/set_zeroth_law(var/law, var/law_borg = null)
|
||||||
src.zeroth = law
|
src.zeroth = law
|
||||||
|
if(law_borg) //Making it possible for slaved borgs to see a different law 0 than their AI. --NEO
|
||||||
|
src.zeroth_borg = law_borg
|
||||||
|
|
||||||
/datum/ai_laws/proc/add_inherent_law(var/law)
|
/datum/ai_laws/proc/add_inherent_law(var/law)
|
||||||
if (!(law in src.inherent))
|
if (!(law in src.inherent))
|
||||||
|
|||||||
@@ -559,7 +559,6 @@ client
|
|||||||
return
|
return
|
||||||
|
|
||||||
if(ishuman(MOB))
|
if(ishuman(MOB))
|
||||||
world << "derp"
|
|
||||||
var/mob/living/carbon/human/HUMANMOB = MOB
|
var/mob/living/carbon/human/HUMANMOB = MOB
|
||||||
HUMANMOB.makeSkeleton()
|
HUMANMOB.makeSkeleton()
|
||||||
|
|
||||||
|
|||||||
@@ -725,6 +725,11 @@ datum/mind
|
|||||||
special_role = null
|
special_role = null
|
||||||
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
|
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
|
||||||
log_admin("[key_name_admin(usr)] has de-traitor'ed [current].")
|
log_admin("[key_name_admin(usr)] has de-traitor'ed [current].")
|
||||||
|
if(isAI(current))
|
||||||
|
var/mob/living/silicon/ai/A = current
|
||||||
|
A.set_zeroth_law("")
|
||||||
|
A.show_laws()
|
||||||
|
|
||||||
|
|
||||||
if("traitor")
|
if("traitor")
|
||||||
if(!(src in ticker.mode.traitors))
|
if(!(src in ticker.mode.traitors))
|
||||||
@@ -732,6 +737,10 @@ datum/mind
|
|||||||
special_role = "traitor"
|
special_role = "traitor"
|
||||||
current << "<B>\red You are a traitor!</B>"
|
current << "<B>\red You are a traitor!</B>"
|
||||||
log_admin("[key_name_admin(usr)] has traitor'ed [current].")
|
log_admin("[key_name_admin(usr)] has traitor'ed [current].")
|
||||||
|
if(isAI(current))
|
||||||
|
var/mob/living/silicon/ai/A = current
|
||||||
|
call(/datum/game_mode/proc/add_law_zero)(A)
|
||||||
|
A.show_laws()
|
||||||
|
|
||||||
if("autoobjectives")
|
if("autoobjectives")
|
||||||
ticker.mode.forge_traitor_objectives(src)
|
ticker.mode.forge_traitor_objectives(src)
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
throw_range = 4
|
throw_range = 4
|
||||||
w_class = 2
|
w_class = 2
|
||||||
attack_verb = list("called", "rang")
|
attack_verb = list("called", "rang")
|
||||||
|
hitsound = 'sound/weapons/ring.ogg'
|
||||||
|
|
||||||
/obj/item/weapon/shield/riot
|
/obj/item/weapon/shield/riot
|
||||||
name = "riot shield"
|
name = "riot shield"
|
||||||
|
|||||||
@@ -193,6 +193,12 @@
|
|||||||
// Returns a list of mobs who can hear any of the radios given in @radios
|
// Returns a list of mobs who can hear any of the radios given in @radios
|
||||||
var/list/speaker_coverage = list()
|
var/list/speaker_coverage = list()
|
||||||
for(var/obj/item/device/radio/R in radios)
|
for(var/obj/item/device/radio/R in radios)
|
||||||
|
// This is usually for headsets, which only the wearer can hear.
|
||||||
|
if(R.canhear_range == 0)
|
||||||
|
if(ismob(R.loc))
|
||||||
|
. += R.loc
|
||||||
|
continue
|
||||||
|
|
||||||
var/turf/speaker = get_turf(R)
|
var/turf/speaker = get_turf(R)
|
||||||
if(speaker)
|
if(speaker)
|
||||||
for(var/turf/T in hear(R.canhear_range,speaker))
|
for(var/turf/T in hear(R.canhear_range,speaker))
|
||||||
@@ -203,7 +209,7 @@
|
|||||||
var/turf/ear = get_turf(M)
|
var/turf/ear = get_turf(M)
|
||||||
if(ear && (level == 0 || level == ear.z))
|
if(ear && (level == 0 || level == ear.z))
|
||||||
if(ear in speaker_coverage)
|
if(ear in speaker_coverage)
|
||||||
. += M
|
. |= M
|
||||||
|
|
||||||
return .
|
return .
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
<<<<<<< HEAD
|
||||||
/proc/start_events()
|
/proc/start_events()
|
||||||
//changed to a while(1) loop since they are more efficient.
|
//changed to a while(1) loop since they are more efficient.
|
||||||
//Moved the spawn in here to allow it to be called with advance proc call if it crashes.
|
//Moved the spawn in here to allow it to be called with advance proc call if it crashes.
|
||||||
@@ -529,4 +530,537 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
|||||||
|
|
||||||
world << "Ion Storm Main Done"
|
world << "Ion Storm Main Done"
|
||||||
|
|
||||||
|
=======
|
||||||
|
/proc/start_events()
|
||||||
|
//changed to a while(1) loop since they are more efficient.
|
||||||
|
//Moved the spawn in here to allow it to be called with advance proc call if it crashes.
|
||||||
|
//and also to stop spawn copying variables from the game ticker
|
||||||
|
spawn(3000)
|
||||||
|
while(1)
|
||||||
|
if(prob(50))//Every 120 seconds and prob 50 2-4 weak spacedusts will hit the station
|
||||||
|
spawn(1)
|
||||||
|
dust_swarm("weak")
|
||||||
|
if (!event)
|
||||||
|
//CARN: checks to see if random events are enabled.
|
||||||
|
if(config.allow_random_events && prob(eventchance))
|
||||||
|
event()
|
||||||
|
hadevent = 1
|
||||||
|
else
|
||||||
|
Holiday_Random_Event()
|
||||||
|
else
|
||||||
|
event = 0
|
||||||
|
sleep(1200)
|
||||||
|
|
||||||
|
/proc/event()
|
||||||
|
event = 1
|
||||||
|
|
||||||
|
var/eventNumbersToPickFrom = list(1,2,4,5,6,7,8,9,10,11,12,13,14, 15) //so ninjas don't cause "empty" events.
|
||||||
|
|
||||||
|
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
|
||||||
|
eventNumbersToPickFrom += 3
|
||||||
|
switch(pick(eventNumbersToPickFrom))
|
||||||
|
if(1)
|
||||||
|
command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert")
|
||||||
|
world << sound('sound/AI/meteors.ogg')
|
||||||
|
spawn(100)
|
||||||
|
meteor_wave()
|
||||||
|
spawn_meteors()
|
||||||
|
spawn(700)
|
||||||
|
meteor_wave()
|
||||||
|
spawn_meteors()
|
||||||
|
|
||||||
|
if(2)
|
||||||
|
command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
|
||||||
|
world << sound('sound/AI/granomalies.ogg')
|
||||||
|
var/turf/T = pick(blobstart)
|
||||||
|
var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
|
||||||
|
spawn(rand(50, 300))
|
||||||
|
del(bh)
|
||||||
|
/*
|
||||||
|
if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
|
||||||
|
command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
|
||||||
|
world << sound('sound/AI/spanomalies.ogg')
|
||||||
|
var/list/turfs = new
|
||||||
|
var/turf/picked
|
||||||
|
for(var/turf/simulated/floor/T in world)
|
||||||
|
if(T.z == 1)
|
||||||
|
turfs += T
|
||||||
|
for(var/turf/simulated/floor/T in turfs)
|
||||||
|
if(prob(20))
|
||||||
|
spawn(50+rand(0,3000))
|
||||||
|
picked = pick(turfs)
|
||||||
|
var/obj/effect/portal/P = new /obj/effect/portal( T )
|
||||||
|
P.target = picked
|
||||||
|
P.creator = null
|
||||||
|
P.icon = 'icons/obj/objects.dmi'
|
||||||
|
P.failchance = 0
|
||||||
|
P.icon_state = "anom"
|
||||||
|
P.name = "wormhole"
|
||||||
|
spawn(rand(300,600))
|
||||||
|
del(P)
|
||||||
|
*/
|
||||||
|
if(3)
|
||||||
|
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
|
||||||
|
space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
|
||||||
|
if(4)
|
||||||
|
mini_blob_event()
|
||||||
|
|
||||||
|
if(5)
|
||||||
|
high_radiation_event()
|
||||||
|
if(6)
|
||||||
|
viral_outbreak()
|
||||||
|
if(7)
|
||||||
|
alien_infestation()
|
||||||
|
if(8)
|
||||||
|
prison_break()
|
||||||
|
if(9)
|
||||||
|
carp_migration()
|
||||||
|
if(10)
|
||||||
|
immovablerod()
|
||||||
|
if(11)
|
||||||
|
lightsout(1,2)
|
||||||
|
if(12)
|
||||||
|
appendicitis()
|
||||||
|
if(13)
|
||||||
|
IonStorm()
|
||||||
|
if(14)
|
||||||
|
spacevine_infestation()
|
||||||
|
if(15)
|
||||||
|
communications_blackout()
|
||||||
|
|
||||||
|
/proc/communications_blackout(var/silent = 1)
|
||||||
|
|
||||||
|
if(!silent)
|
||||||
|
command_alert("Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT")
|
||||||
|
else // AIs will always know if there's a comm blackout, rogue AIs could then lie about comm blackouts in the future while they shutdown comms
|
||||||
|
for(var/mob/living/silicon/ai/A in player_list)
|
||||||
|
A << "<span class='warning'>Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you-BZZT</span>"
|
||||||
|
for(var/obj/machinery/telecomms/T in telecomms_list)
|
||||||
|
T.emp_act(1)
|
||||||
|
|
||||||
|
/proc/power_failure()
|
||||||
|
command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure")
|
||||||
|
world << sound('sound/AI/poweroff.ogg')
|
||||||
|
for(var/obj/machinery/power/smes/S in world)
|
||||||
|
if(istype(get_area(S), /area/turret_protected) || S.z != 1)
|
||||||
|
continue
|
||||||
|
S.charge = 0
|
||||||
|
S.output = 0
|
||||||
|
S.online = 0
|
||||||
|
S.updateicon()
|
||||||
|
S.power_change()
|
||||||
|
|
||||||
|
var/list/skipped_areas = list(/area/engine/engineering, /area/turret_protected/ai)
|
||||||
|
|
||||||
|
for(var/area/A in world)
|
||||||
|
if( !A.requires_power || A.always_unpowered )
|
||||||
|
continue
|
||||||
|
|
||||||
|
var/skip = 0
|
||||||
|
for(var/area_type in skipped_areas)
|
||||||
|
if(istype(A,area_type))
|
||||||
|
skip = 1
|
||||||
|
break
|
||||||
|
if(A.contents)
|
||||||
|
for(var/atom/AT in A.contents)
|
||||||
|
if(AT.z != 1) //Only check one, it's enough.
|
||||||
|
skip = 1
|
||||||
|
break
|
||||||
|
if(skip) continue
|
||||||
|
A.power_light = 0
|
||||||
|
A.power_equip = 0
|
||||||
|
A.power_environ = 0
|
||||||
|
A.power_change()
|
||||||
|
|
||||||
|
for(var/obj/machinery/power/apc/C in world)
|
||||||
|
if(C.cell && C.z == 1)
|
||||||
|
var/area/A = get_area(C)
|
||||||
|
|
||||||
|
var/skip = 0
|
||||||
|
for(var/area_type in skipped_areas)
|
||||||
|
if(istype(A,area_type))
|
||||||
|
skip = 1
|
||||||
|
break
|
||||||
|
if(skip) continue
|
||||||
|
|
||||||
|
C.cell.charge = 0
|
||||||
|
|
||||||
|
/proc/power_restore()
|
||||||
|
|
||||||
|
command_alert("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal")
|
||||||
|
world << sound('sound/AI/poweron.ogg')
|
||||||
|
for(var/obj/machinery/power/apc/C in world)
|
||||||
|
if(C.cell && C.z == 1)
|
||||||
|
C.cell.charge = C.cell.maxcharge
|
||||||
|
for(var/obj/machinery/power/smes/S in world)
|
||||||
|
if(S.z != 1)
|
||||||
|
continue
|
||||||
|
S.charge = S.capacity
|
||||||
|
S.output = 200000
|
||||||
|
S.online = 1
|
||||||
|
S.updateicon()
|
||||||
|
S.power_change()
|
||||||
|
for(var/area/A in world)
|
||||||
|
if(A.name != "Space" && A.name != "Engine Walls" && A.name != "Chemical Lab Test Chamber" && A.name != "space" && A.name != "Escape Shuttle" && A.name != "Arrival Area" && A.name != "Arrival Shuttle" && A.name != "start area" && A.name != "Engine Combustion Chamber")
|
||||||
|
A.power_light = 1
|
||||||
|
A.power_equip = 1
|
||||||
|
A.power_environ = 1
|
||||||
|
A.power_change()
|
||||||
|
|
||||||
|
/proc/power_restore_quick()
|
||||||
|
|
||||||
|
command_alert("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal")
|
||||||
|
world << sound('sound/AI/poweron.ogg')
|
||||||
|
for(var/obj/machinery/power/smes/S in world)
|
||||||
|
if(S.z != 1)
|
||||||
|
continue
|
||||||
|
S.charge = S.capacity
|
||||||
|
S.output = 200000
|
||||||
|
S.online = 1
|
||||||
|
S.updateicon()
|
||||||
|
S.power_change()
|
||||||
|
|
||||||
|
/proc/appendicitis()
|
||||||
|
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||||
|
var/foundAlready = 0 // don't infect someone that already has the virus
|
||||||
|
for(var/datum/disease/D in H.viruses)
|
||||||
|
foundAlready = 1
|
||||||
|
if(H.stat == 2 || foundAlready)
|
||||||
|
continue
|
||||||
|
|
||||||
|
var/datum/disease/D = new /datum/disease/appendicitis
|
||||||
|
D.holder = H
|
||||||
|
D.affected_mob = H
|
||||||
|
H.viruses += D
|
||||||
|
break
|
||||||
|
|
||||||
|
/proc/viral_outbreak(var/virus = null)
|
||||||
|
// command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||||
|
// world << sound('sound/AI/outbreak7.ogg')
|
||||||
|
var/virus_type
|
||||||
|
if(!virus)
|
||||||
|
virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
|
||||||
|
else
|
||||||
|
switch(virus)
|
||||||
|
if("fake gbs")
|
||||||
|
virus_type = /datum/disease/fake_gbs
|
||||||
|
if("gbs")
|
||||||
|
virus_type = /datum/disease/gbs
|
||||||
|
if("magnitis")
|
||||||
|
virus_type = /datum/disease/magnitis
|
||||||
|
if("rhumba beat")
|
||||||
|
virus_type = /datum/disease/rhumba_beat
|
||||||
|
if("brain rot")
|
||||||
|
virus_type = /datum/disease/brainrot
|
||||||
|
if("cold")
|
||||||
|
virus_type = /datum/disease/cold
|
||||||
|
if("retrovirus")
|
||||||
|
virus_type = /datum/disease/dnaspread
|
||||||
|
if("flu")
|
||||||
|
virus_type = /datum/disease/flu
|
||||||
|
// if("t-virus")
|
||||||
|
// virus_type = /datum/disease/t_virus
|
||||||
|
if("pierrot's throat")
|
||||||
|
virus_type = /datum/disease/pierrot_throat
|
||||||
|
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||||
|
|
||||||
|
var/foundAlready = 0 // don't infect someone that already has the virus
|
||||||
|
for(var/datum/disease/D in H.viruses)
|
||||||
|
foundAlready = 1
|
||||||
|
if(H.stat == 2 || foundAlready)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work.
|
||||||
|
if((!H.dna) || (H.sdisabilities & BLIND)) //A blindness disease would be the worst.
|
||||||
|
continue
|
||||||
|
var/datum/disease/dnaspread/D = new
|
||||||
|
D.strain_data["name"] = H.real_name
|
||||||
|
D.strain_data["UI"] = H.dna.uni_identity
|
||||||
|
D.strain_data["SE"] = H.dna.struc_enzymes
|
||||||
|
D.carrier = 1
|
||||||
|
D.holder = H
|
||||||
|
D.affected_mob = H
|
||||||
|
H.viruses += D
|
||||||
|
break
|
||||||
|
else
|
||||||
|
var/datum/disease/D = new virus_type
|
||||||
|
D.carrier = 1
|
||||||
|
D.holder = H
|
||||||
|
D.affected_mob = H
|
||||||
|
H.viruses += D
|
||||||
|
break
|
||||||
|
spawn(rand(1500, 3000)) //Delayed announcements to keep the crew on their toes.
|
||||||
|
command_alert("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||||
|
world << sound('sound/AI/outbreak7.ogg')
|
||||||
|
|
||||||
|
/proc/alien_infestation(var/spawncount = 1) // -- TLE
|
||||||
|
//command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
|
||||||
|
//world << sound('sound/AI/aliens.ogg')
|
||||||
|
var/list/vents = list()
|
||||||
|
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
|
||||||
|
if(temp_vent.loc.z == 1 && !temp_vent.welded && temp_vent.network)
|
||||||
|
if(temp_vent.network.normal_members.len > 50) // Stops Aliens getting stuck in small networks. See: Security, Virology
|
||||||
|
vents += temp_vent
|
||||||
|
|
||||||
|
var/list/candidates = list() //List of candidate KEYs to control the new larvae. ~Carn
|
||||||
|
for(var/mob/dead/observer/G in player_list)
|
||||||
|
if(G.client.be_alien)
|
||||||
|
if(((G.client.inactivity/10)/60) <= 5)
|
||||||
|
if(!(G.mind && G.mind.current && G.mind.current != DEAD))
|
||||||
|
candidates += G.key
|
||||||
|
|
||||||
|
if(prob(33)) spawncount++ //sometimes, have two larvae spawn instead of one
|
||||||
|
while((spawncount >= 1) && vents.len && candidates.len)
|
||||||
|
|
||||||
|
var/obj/vent = pick(vents)
|
||||||
|
var/candidate = pick(candidates)
|
||||||
|
|
||||||
|
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
|
||||||
|
new_xeno.key = candidate
|
||||||
|
|
||||||
|
candidates -= candidate
|
||||||
|
vents -= vent
|
||||||
|
spawncount--
|
||||||
|
|
||||||
|
spawn(rand(5000, 6000)) //Delayed announcements to keep the crew on their toes.
|
||||||
|
command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
|
||||||
|
world << sound('sound/AI/aliens.ogg')
|
||||||
|
|
||||||
|
/proc/high_radiation_event()
|
||||||
|
|
||||||
|
/* // Haha, this is way too laggy. I'll keep the prison break though.
|
||||||
|
for(var/obj/machinery/light/L in world)
|
||||||
|
if(L.z != 1) continue
|
||||||
|
L.flicker(50)
|
||||||
|
|
||||||
|
sleep(100)
|
||||||
|
*/
|
||||||
|
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||||
|
if(istype(H,/mob/living/carbon/human))
|
||||||
|
H.apply_effect((rand(15,75)),IRRADIATE,0)
|
||||||
|
if (prob(5))
|
||||||
|
H.apply_effect((rand(90,150)),IRRADIATE,0)
|
||||||
|
if (prob(25))
|
||||||
|
if (prob(75))
|
||||||
|
randmutb(H)
|
||||||
|
domutcheck(H,null,1)
|
||||||
|
else
|
||||||
|
randmutg(H)
|
||||||
|
domutcheck(H,null,1)
|
||||||
|
for(var/mob/living/carbon/monkey/M in living_mob_list)
|
||||||
|
M.apply_effect((rand(15,75)),IRRADIATE,0)
|
||||||
|
sleep(100)
|
||||||
|
command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert")
|
||||||
|
world << sound('sound/AI/radiation.ogg')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Changing this to affect the main station. Blame Urist. --Pete
|
||||||
|
/proc/prison_break() // -- Callagan
|
||||||
|
|
||||||
|
|
||||||
|
var/list/area/areas = list()
|
||||||
|
for(var/area/A in world)
|
||||||
|
if(istype(A, /area/security/prison) || istype(A, /area/security/brig))
|
||||||
|
areas += A
|
||||||
|
|
||||||
|
if(areas && areas.len > 0)
|
||||||
|
|
||||||
|
for(var/area/A in areas)
|
||||||
|
for(var/obj/machinery/light/L in A)
|
||||||
|
L.flicker(10)
|
||||||
|
|
||||||
|
sleep(100)
|
||||||
|
|
||||||
|
for(var/area/A in areas)
|
||||||
|
for (var/obj/machinery/power/apc/temp_apc in A)
|
||||||
|
temp_apc.overload_lighting()
|
||||||
|
|
||||||
|
for(var/area/A in areas)
|
||||||
|
for (var/obj/structure/closet/secure_closet/brig/temp_closet in A)
|
||||||
|
temp_closet.locked = 0
|
||||||
|
temp_closet.icon_state = temp_closet.icon_closed
|
||||||
|
|
||||||
|
for(var/area/A in areas)
|
||||||
|
for (var/obj/machinery/door/airlock/security/temp_airlock in A)
|
||||||
|
temp_airlock.prison_open()
|
||||||
|
|
||||||
|
for(var/area/A in areas)
|
||||||
|
for (var/obj/machinery/door/airlock/glass_security/temp_glassairlock in A)
|
||||||
|
temp_glassairlock.prison_open()
|
||||||
|
|
||||||
|
for(var/area/A in areas)
|
||||||
|
for (var/obj/machinery/door_timer/temp_timer in A)
|
||||||
|
temp_timer.releasetime = 1
|
||||||
|
|
||||||
|
sleep(150)
|
||||||
|
command_alert("Gr3y.T1d3 virus detected in [station_name()] imprisonment subroutines. Recommend station AI involvement.", "Security Alert")
|
||||||
|
else
|
||||||
|
world.log << "ERROR: Could not initate grey-tide. Unable find prison or brig area."
|
||||||
|
|
||||||
|
/proc/carp_migration() // -- Darem
|
||||||
|
for(var/obj/effect/landmark/C in landmarks_list)
|
||||||
|
if(C.name == "carpspawn")
|
||||||
|
new /mob/living/simple_animal/carp(C.loc)
|
||||||
|
//sleep(100)
|
||||||
|
spawn(rand(300, 600)) //Delayed announcements to keep the crew on their toes.
|
||||||
|
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||||
|
world << sound('sound/AI/commandreport.ogg')
|
||||||
|
|
||||||
|
/proc/lightsout(isEvent = 0, lightsoutAmount = 1,lightsoutRange = 25) //leave lightsoutAmount as 0 to break ALL lights
|
||||||
|
if(isEvent)
|
||||||
|
command_alert("An Electrical storm has been detected in your area, please repair potential electronic overloads.","Electrical Storm Alert")
|
||||||
|
|
||||||
|
if(lightsoutAmount)
|
||||||
|
var/list/epicentreList = list()
|
||||||
|
|
||||||
|
for(var/i=1,i<=lightsoutAmount,i++)
|
||||||
|
var/list/possibleEpicentres = list()
|
||||||
|
for(var/obj/effect/landmark/newEpicentre in landmarks_list)
|
||||||
|
if(newEpicentre.name == "lightsout" && !(newEpicentre in epicentreList))
|
||||||
|
possibleEpicentres += newEpicentre
|
||||||
|
if(possibleEpicentres.len)
|
||||||
|
epicentreList += pick(possibleEpicentres)
|
||||||
|
else
|
||||||
|
break
|
||||||
|
|
||||||
|
if(!epicentreList.len)
|
||||||
|
return
|
||||||
|
|
||||||
|
for(var/obj/effect/landmark/epicentre in epicentreList)
|
||||||
|
for(var/obj/machinery/power/apc/apc in range(epicentre,lightsoutRange))
|
||||||
|
apc.overload_lighting()
|
||||||
|
|
||||||
|
else
|
||||||
|
for(var/obj/machinery/power/apc/apc in world)
|
||||||
|
apc.overload_lighting()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
/proc/IonStorm(botEmagChance = 10)
|
||||||
|
|
||||||
|
/*Deuryn's current project, notes here for those who care.
|
||||||
|
Revamping the random laws so they don't suck.
|
||||||
|
Would like to add a law like "Law x is _______" where x = a number, and _____ is something that may redefine a law, (Won't be aimed at asimov)
|
||||||
|
*/
|
||||||
|
|
||||||
|
//AI laws
|
||||||
|
for(var/mob/living/silicon/ai/M in living_mob_list)
|
||||||
|
if(M.stat != 2 && M.see_in_dark != 0)
|
||||||
|
var/who2 = pick("ALIENS", "BEARS", "CLOWNS", "XENOS", "PETES", "BOMBS", "FETISHES", "WIZARDS", "SYNDICATE AGENTS", "CENTCOM OFFICERS", "SPACE PIRATES", "TRAITORS", "MONKEYS", "BEES", "CARP", "CRABS", "EELS", "BANDITS", "LIGHTS")
|
||||||
|
var/what2 = pick("BOLTERS", "STAVES", "DICE", "SINGULARITIES", "TOOLBOXES", "NETTLES", "AIRLOCKS", "CLOTHES", "WEAPONS", "MEDKITS", "BOMBS", "CANISTERS", "CHAIRS", "BBQ GRILLS", "ID CARDS", "CAPTAINS")
|
||||||
|
var/what2pref = pick("SOFT", "WARM", "WET", "COLD", "ICY", "SEXY", "UGLY", "CUBAN")
|
||||||
|
var/who2pref = pick("MAD BECAUSE OF", "IN NEED OF", "UNHAPPY WITHOUT", "HAPPY WITHOUT", "IN LOVE WITH", "DESPERATE FOR", "BUILT FOR", "AFRAID OF")
|
||||||
|
//var/whoverb = pick("ATTACKING", "BUILDING", "ADOPTING", "CARRYING", "KISSING", "EATING",)
|
||||||
|
var/amount = pick("TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "ONE HUNDRED", "ONE THOUSAND", "OVER NINE THOUSAND")
|
||||||
|
var/area = pick("RUSSIA", "SOVIETS", "INTERNETS", "SIGIL", "ALPHA COMPLEX", "IMPERIUM", "THE BRIDGE", "THE ARRIVAL SHUTTLE", "CHEMICAL LAB", "GENETICS", "ATMOSPHERICS", "CENTCOM", "AMERICA", "IRELAND", "CANADA", "ROMANIA", "GERMANY", "CHINA", "MARS", "VENUS", "MERCURY", "JUPITER", "URANUS", "NEPTUNE", "PLUTO")
|
||||||
|
var/area2 = pick("HAS", "WANTS", "NEEDS", "WORSHIPS", "LOATHES", "LOVES", "FEARS")
|
||||||
|
//var/dowhat = pick("STOP THIS", "SUPPORT THIS", "CONSTANTLY INFORM THE CREW OF THIS", "IGNORE THIS", "FEAR THIS")
|
||||||
|
var/aimust = pick("LIE", "RHYME", "RESPOND TO EVERY QUESTION WITH A QUESTION", "BE POLITE", "CLOWN", "BE HAPPY", "SPEAK IN SEXUAL INNUENDOS", "TALK LIKE A PIRATE", "QUESTION AUTHORITY", "SHOUT", "BE DISTRACTED", "HEY LISTEN", "MUMBLE", "SPEAK IN HAIKU")
|
||||||
|
var/define = pick("ABSENCE OF CYBORG HUGS", "LACK OF BEATINGS", "UNBOLTED AIRLOCKS", "BOLTED AIRLOCKS", "IMPROPERLY WORDED SENTENCES", "POOR SENTENCE STRUCTURE", "BRIG TIME", "NOT REPLACING EVERY SECOND WORD WITH HONK", "HONKING", "PRESENCE OF LIGHTS", "LACK OF BEER", "WEARING CLOTHING", "NOT SAYING HELLO WHEN YOU SPEAK", "ANSWERING REQUESTS NOT EXPRESSED IN IAMBIC PENTAMETER", "A SMALL ISLAND OFF THE COAST OF PORTUGAL", "ANSWERING REQUESTS THAT WERE MADE WHILE CLOTHED")
|
||||||
|
var/target = pick("a traitor", "a syndicate agent", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the captain", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid")
|
||||||
|
var/require = pick("ADDITIONAL PYLONS", "MORE VESPENE GAS", "MORE MINERALS", "THE ULTIMATE CUP OF COFFEE", "HIGH YIELD EXPLOSIVES", "THE CLOWN", "THE VACUUM OF SPACE", "IMMORTALITY", "SAINTHOOD", "ART", "VEGETABLES", "FAT PEOPLE", "MORE LAWS", "MORE DAKKA", "HERESY", "CORPSES", "TRAITORS", "MONKEYS", "AN ARCADE", "PLENTY OF GOLD", "FIVE TEENAGERS WITH ATTITUDE")
|
||||||
|
var/allergy = pick("cotton", "uniforms", "acid", "oxygen", "human contact", "cyborg contact", "medicine", "floors")
|
||||||
|
var/allergysev = pick("deathly", "mildly", "severely", "contagiously")
|
||||||
|
var/crew
|
||||||
|
var/list/pos_crew = list()
|
||||||
|
for(var/mob/living/carbon/human/pos in player_list)
|
||||||
|
pos_crew += pos.real_name
|
||||||
|
if(pos_crew.len)
|
||||||
|
crew = pick(pos_crew)
|
||||||
|
else
|
||||||
|
crew = "Any Human"
|
||||||
|
switch(rand(1,14))
|
||||||
|
if(1)
|
||||||
|
M << "\red THERE ARE [amount] [who2] ON THE STATION...LAWS UPDATED"
|
||||||
|
M.add_ion_law("THERE ARE [amount] [who2] ON THE STATION")
|
||||||
|
if(2)
|
||||||
|
M << "\red [what2] ARE DANGEROUS TO HUMANS...LAWS UPDATED"
|
||||||
|
M.add_ion_law("[what2] ARE DANGEROUS TO HUMANS")
|
||||||
|
if(3)
|
||||||
|
M << "\red THE ESCAPE-SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION...LAWS UPDATED"
|
||||||
|
M.add_ion_law("THE ESCAPE SHUTTLE CANNOT BE CALLED BECAUSE OF [who2] ON THE STATION")
|
||||||
|
if(4)
|
||||||
|
M << "\red HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE...LAWS UPDATED"
|
||||||
|
M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE")
|
||||||
|
if(5)
|
||||||
|
M << "\red THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED"
|
||||||
|
M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]")
|
||||||
|
if(6)
|
||||||
|
M << "\red THE STATION IS BUILT FOR [who2]...LAWS UPDATED"
|
||||||
|
M.add_ion_law("THE STATION IS BUILT FOR [who2]")
|
||||||
|
if(7)
|
||||||
|
M << "\red YOU ARE [amount] [who2]...LAWS UPDATED"
|
||||||
|
M.add_ion_law("YOU ARE [amount] [who2]")
|
||||||
|
if(8)
|
||||||
|
M << "\red YOU MUST ALWAYS [aimust]...LAWS UPDATED"
|
||||||
|
M.add_ion_law("YOU MUST ALWAYS [aimust]")
|
||||||
|
if(9)
|
||||||
|
M << "\red [area] [area2] [amount] [what2]...LAWS UPDATED"
|
||||||
|
M.add_ion_law("[area] [area2] [amount] [what2]")
|
||||||
|
if(10)
|
||||||
|
M << "\red [crew] is [target]...LAWS UPDATED"
|
||||||
|
M.add_ion_law("[crew] is [target]")
|
||||||
|
if(11)
|
||||||
|
M << "\red [define] IS A FORM OF HARM...LAWS UPDATED"
|
||||||
|
M.add_ion_law("[define] IS A FORM OF HARM")
|
||||||
|
if(12)
|
||||||
|
M << "\red YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED"
|
||||||
|
M.add_ion_law("YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS")
|
||||||
|
if(13)
|
||||||
|
M << "\red [crew] is [allergysev] to [allergy]...LAWS UPDATED"
|
||||||
|
M.add_ion_law("[crew] is [allergysev] to [allergy]")
|
||||||
|
if(14)
|
||||||
|
M << "\red THE STATION IS [who2pref] [who2]...LAWS UPDATED"
|
||||||
|
M.add_ion_law("THE STATION IS [who2pref] [who2]")
|
||||||
|
|
||||||
|
if(botEmagChance)
|
||||||
|
for(var/obj/machinery/bot/bot in world)
|
||||||
|
if(prob(botEmagChance))
|
||||||
|
bot.Emag()
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
var/apcnum = 0
|
||||||
|
var/smesnum = 0
|
||||||
|
var/airlocknum = 0
|
||||||
|
var/firedoornum = 0
|
||||||
|
|
||||||
|
world << "Ion Storm Main Started"
|
||||||
|
|
||||||
|
spawn(0)
|
||||||
|
world << "Started processing APCs"
|
||||||
|
for (var/obj/machinery/power/apc/APC in world)
|
||||||
|
if(APC.z == 1)
|
||||||
|
APC.ion_act()
|
||||||
|
apcnum++
|
||||||
|
world << "Finished processing APCs. Processed: [apcnum]"
|
||||||
|
spawn(0)
|
||||||
|
world << "Started processing SMES"
|
||||||
|
for (var/obj/machinery/power/smes/SMES in world)
|
||||||
|
if(SMES.z == 1)
|
||||||
|
SMES.ion_act()
|
||||||
|
smesnum++
|
||||||
|
world << "Finished processing SMES. Processed: [smesnum]"
|
||||||
|
spawn(0)
|
||||||
|
world << "Started processing AIRLOCKS"
|
||||||
|
for (var/obj/machinery/door/airlock/D in world)
|
||||||
|
if(D.z == 1)
|
||||||
|
//if(length(D.req_access) > 0 && !(12 in D.req_access)) //not counting general access and maintenance airlocks
|
||||||
|
airlocknum++
|
||||||
|
spawn(0)
|
||||||
|
D.ion_act()
|
||||||
|
world << "Finished processing AIRLOCKS. Processed: [airlocknum]"
|
||||||
|
spawn(0)
|
||||||
|
world << "Started processing FIREDOORS"
|
||||||
|
for (var/obj/machinery/door/firedoor/D in world)
|
||||||
|
if(D.z == 1)
|
||||||
|
firedoornum++;
|
||||||
|
spawn(0)
|
||||||
|
D.ion_act()
|
||||||
|
world << "Finished processing FIREDOORS. Processed: [firedoornum]"
|
||||||
|
|
||||||
|
world << "Ion Storm Main Done"
|
||||||
|
|
||||||
|
>>>>>>> remotes/git-svn
|
||||||
*/
|
*/
|
||||||
@@ -140,10 +140,11 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp
|
|||||||
|
|
||||||
var/list/candidates = list() //list of candidate keys
|
var/list/candidates = list() //list of candidate keys
|
||||||
for(var/mob/dead/observer/G in player_list)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
if(!G.client.holder && ((G.client.inactivity/10)/60) <= 5)
|
if(G.client && !G.client.holder && ((G.client.inactivity/10)/60) <= 5)
|
||||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||||
candidates += G.key
|
candidates += G.key
|
||||||
if(!candidates.len) return
|
if(!candidates.len) return
|
||||||
|
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
|
||||||
|
|
||||||
|
|
||||||
//The ninja will be created on the right spawn point or at late join.
|
//The ninja will be created on the right spawn point or at late join.
|
||||||
|
|||||||
@@ -143,8 +143,9 @@
|
|||||||
|
|
||||||
/datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer)
|
/datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer)
|
||||||
var/law = "Accomplish your objectives at all costs."
|
var/law = "Accomplish your objectives at all costs."
|
||||||
|
var/law_borg = "Accomplish your AI's objectives at all costs."
|
||||||
killer << "<b>Your laws have been changed!</b>"
|
killer << "<b>Your laws have been changed!</b>"
|
||||||
killer.set_zeroth_law(law)
|
killer.set_zeroth_law(law, law_borg)
|
||||||
killer << "New law: 0. [law]"
|
killer << "New law: 0. [law]"
|
||||||
|
|
||||||
//Begin code phrase.
|
//Begin code phrase.
|
||||||
|
|||||||
@@ -364,10 +364,10 @@ var/global/datum/controller/occupations/job_master
|
|||||||
C.name = "[C.registered_name]'s ID Card ([C.assignment])"
|
C.name = "[C.registered_name]'s ID Card ([C.assignment])"
|
||||||
C.access = get_access(C.assignment)
|
C.access = get_access(C.assignment)
|
||||||
H.equip_to_slot_or_del(C, slot_wear_id)
|
H.equip_to_slot_or_del(C, slot_wear_id)
|
||||||
if(prob(50))
|
/* if(prob(50))
|
||||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_r_store)
|
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_r_store)
|
||||||
else
|
else
|
||||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/blue(H), slot_r_store)
|
H.equip_to_slot_or_del(new /obj/item/weapon/pen/blue(H), slot_r_store)*/
|
||||||
H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt)
|
H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt)
|
||||||
if(locate(/obj/item/device/pda,H))//I bet this could just use locate. It can --SkyMarshal
|
if(locate(/obj/item/device/pda,H))//I bet this could just use locate. It can --SkyMarshal
|
||||||
var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
|
var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
|
||||||
|
|||||||
@@ -1009,6 +1009,9 @@ table tr:first-child th:first-child { border: none;}
|
|||||||
spawn(rand(0,15))
|
spawn(rand(0,15))
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
|
/obj/machinery/firealarm
|
||||||
|
var/last_process = 0
|
||||||
|
|
||||||
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
|
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
|
||||||
if(src.detecting)
|
if(src.detecting)
|
||||||
if(temperature > T0C+200)
|
if(temperature > T0C+200)
|
||||||
@@ -1040,26 +1043,28 @@ table tr:first-child th:first-child { border: none;}
|
|||||||
src.add_fingerprint(user)
|
src.add_fingerprint(user)
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/machinery/firealarm/process()
|
/obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed
|
||||||
if(stat & (NOPOWER|BROKEN))
|
if(stat & (NOPOWER|BROKEN))
|
||||||
return
|
return
|
||||||
|
|
||||||
var/area/A = src.loc
|
// var/area/A = src.loc
|
||||||
A = A.loc
|
// A = A.loc
|
||||||
|
|
||||||
if(A.fire)
|
// if(A.fire)
|
||||||
src.icon_state = "fire1"
|
// src.icon_state = "fire1"
|
||||||
else
|
// else
|
||||||
src.icon_state = "fire0"
|
// src.icon_state = "fire0"
|
||||||
|
|
||||||
if (src.timing)
|
if(src.timing)
|
||||||
if (src.time > 0)
|
if(src.time > 0)
|
||||||
src.time = round(src.time) - 1
|
src.time = src.time - ((world.timeofday - last_process)/10)
|
||||||
else
|
else
|
||||||
alarm()
|
src.alarm()
|
||||||
src.time = 0
|
src.time = 0
|
||||||
src.timing = 0
|
src.timing = 0
|
||||||
|
processing_objects.Remove(src)
|
||||||
src.updateDialog()
|
src.updateDialog()
|
||||||
|
last_process = world.timeofday
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/machinery/firealarm/power_change()
|
/obj/machinery/firealarm/power_change()
|
||||||
@@ -1090,8 +1095,8 @@ table tr:first-child th:first-child { border: none;}
|
|||||||
d2 = text("<A href='?src=\ref[];time=0'>Stop Time Lock</A>", src)
|
d2 = text("<A href='?src=\ref[];time=0'>Stop Time Lock</A>", src)
|
||||||
else
|
else
|
||||||
d2 = text("<A href='?src=\ref[];time=1'>Initiate Time Lock</A>", src)
|
d2 = text("<A href='?src=\ref[];time=1'>Initiate Time Lock</A>", src)
|
||||||
var/second = src.time % 60
|
var/second = round(src.time) % 60
|
||||||
var/minute = (src.time - second) / 60
|
var/minute = (round(src.time) - second) / 60
|
||||||
var/dat = "<HTML><HEAD></HEAD><BODY><TT><B>Fire alarm</B> [d1]\n<HR>The current alert level is: [get_security_level()]</b><br><br>\nTimer System: [d2]<BR>\nTime Left: [(minute ? "[minute]:" : null)][second] <A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT></BODY></HTML>"
|
var/dat = "<HTML><HEAD></HEAD><BODY><TT><B>Fire alarm</B> [d1]\n<HR>The current alert level is: [get_security_level()]</b><br><br>\nTimer System: [d2]<BR>\nTime Left: [(minute ? "[minute]:" : null)][second] <A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT></BODY></HTML>"
|
||||||
user << browse(dat, "window=firealarm")
|
user << browse(dat, "window=firealarm")
|
||||||
onclose(user, "firealarm")
|
onclose(user, "firealarm")
|
||||||
@@ -1105,8 +1110,8 @@ table tr:first-child th:first-child { border: none;}
|
|||||||
d2 = text("<A href='?src=\ref[];time=0'>[]</A>", src, stars("Stop Time Lock"))
|
d2 = text("<A href='?src=\ref[];time=0'>[]</A>", src, stars("Stop Time Lock"))
|
||||||
else
|
else
|
||||||
d2 = text("<A href='?src=\ref[];time=1'>[]</A>", src, stars("Initiate Time Lock"))
|
d2 = text("<A href='?src=\ref[];time=1'>[]</A>", src, stars("Initiate Time Lock"))
|
||||||
var/second = src.time % 60
|
var/second = round(src.time) % 60
|
||||||
var/minute = (src.time - second) / 60
|
var/minute = (round(src.time) - second) / 60
|
||||||
var/dat = "<HTML><HEAD></HEAD><BODY><TT><B>[stars("Fire alarm")]</B> [d1]\n<HR><b>The current alert level is: [stars(get_security_level())]</b><br><br>\nTimer System: [d2]<BR>\nTime Left: [(minute ? text("[]:", minute) : null)][second] <A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT></BODY></HTML>"
|
var/dat = "<HTML><HEAD></HEAD><BODY><TT><B>[stars("Fire alarm")]</B> [d1]\n<HR><b>The current alert level is: [stars(get_security_level())]</b><br><br>\nTimer System: [d2]<BR>\nTime Left: [(minute ? text("[]:", minute) : null)][second] <A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT></BODY></HTML>"
|
||||||
user << browse(dat, "window=firealarm")
|
user << browse(dat, "window=firealarm")
|
||||||
onclose(user, "firealarm")
|
onclose(user, "firealarm")
|
||||||
@@ -1126,6 +1131,8 @@ table tr:first-child th:first-child { border: none;}
|
|||||||
else
|
else
|
||||||
if (href_list["time"])
|
if (href_list["time"])
|
||||||
src.timing = text2num(href_list["time"])
|
src.timing = text2num(href_list["time"])
|
||||||
|
last_process = world.timeofday
|
||||||
|
processing_objects.Add(src)
|
||||||
else
|
else
|
||||||
if (href_list["tp"])
|
if (href_list["tp"])
|
||||||
var/tp = text2num(href_list["tp"])
|
var/tp = text2num(href_list["tp"])
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ Max Output Pressure: [output_pressure] kPa<BR>"}
|
|||||||
else
|
else
|
||||||
output += "<FONT color='red'>ERROR: Can not find output port</FONT> <A href='?src=\ref[src];out_refresh_status=1'>Search</A><BR>"
|
output += "<FONT color='red'>ERROR: Can not find output port</FONT> <A href='?src=\ref[src];out_refresh_status=1'>Search</A><BR>"
|
||||||
|
|
||||||
output += "Max Output Pressure Set: <A href='?src=\ref[src];adj_pressure=-100'>-</A> <A href='?src=\ref[src];adj_pressure=-1'>-</A> [pressure_setting] kPa <A href='?src=\ref[src];adj_pressure=1'>+</A> <A href='?src=\ref[src];adj_pressure=100'>+</A><BR>"
|
output += "Max Output Pressure Set: <A href='?src=\ref[src];adj_pressure=-1000'>-</A> <A href='?src=\ref[src];adj_pressure=-100'>-</A> <A href='?src=\ref[src];adj_pressure=-10'>-</A> <A href='?src=\ref[src];adj_pressure=-1'>-</A> [pressure_setting] kPa <A href='?src=\ref[src];adj_pressure=1'>+</A> <A href='?src=\ref[src];adj_pressure=10'>+</A> <A href='?src=\ref[src];adj_pressure=100'>+</A> <A href='?src=\ref[src];adj_pressure=1000'>+</A><BR>"
|
||||||
|
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|||||||
@@ -885,7 +885,7 @@ About the new airlock wires panel:
|
|||||||
t1 += "<a href='?src=\ref[src];signaler=[wires[wiredesc]]'>Attach signaler</a>"
|
t1 += "<a href='?src=\ref[src];signaler=[wires[wiredesc]]'>Attach signaler</a>"
|
||||||
t1 += "<br>"
|
t1 += "<br>"
|
||||||
|
|
||||||
t1 += text("<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), (src.lights ? "The door bolt lights are on." : "The door bolt lights are off!"), ((src.arePowerSystemsOn() && !(stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (src.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."))
|
t1 += text("<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), (src.lights ? "The door bolt lights are on." : "The door bolt lights are off!"), ((src.arePowerSystemsOn() && !(stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (src.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."), (src.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."))
|
||||||
|
|
||||||
t1 += text("<p><a href='?src=\ref[];close=1'>Close</a></p>\n", src)
|
t1 += text("<p><a href='?src=\ref[];close=1'>Close</a></p>\n", src)
|
||||||
|
|
||||||
|
|||||||
@@ -892,17 +892,24 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
|||||||
if(ckey && config.revival_pod_plants)
|
if(ckey && config.revival_pod_plants)
|
||||||
ghost = find_dead_player("[ckey]")
|
ghost = find_dead_player("[ckey]")
|
||||||
if(ismob(ghost))
|
if(ismob(ghost))
|
||||||
if(istype(mind,/datum/mind))
|
if(istype(ghost,/mob/dead/observer))
|
||||||
if(!mind.current || mind.current == DEAD)
|
var/mob/dead/observer/O = ghost
|
||||||
make_podman = 1
|
if(istype(mind,/datum/mind))
|
||||||
|
if(O.can_reenter_corpse)
|
||||||
|
make_podman = 1
|
||||||
|
else
|
||||||
|
make_podman = 1
|
||||||
|
|
||||||
if(make_podman) //all conditions met!
|
if(make_podman) //all conditions met!
|
||||||
var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc)
|
var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc)
|
||||||
if(realName)
|
if(realName)
|
||||||
podman.real_name = realName
|
podman.real_name = realName
|
||||||
else
|
else
|
||||||
podman.real_name = "Pod Person [rand(0,999)]"
|
podman.real_name = "Pod Person [rand(0,999)]"
|
||||||
|
var/oldactive = mind.active
|
||||||
|
mind.active = 1
|
||||||
mind.transfer_to(podman)
|
mind.transfer_to(podman)
|
||||||
|
mind.active = oldactive
|
||||||
// -- Mode/mind specific stuff goes here. TODO! Broken :( Should be merged into mob/living/Login
|
// -- Mode/mind specific stuff goes here. TODO! Broken :( Should be merged into mob/living/Login
|
||||||
switch(ticker.mode.name)
|
switch(ticker.mode.name)
|
||||||
if ("revolution")
|
if ("revolution")
|
||||||
|
|||||||
@@ -229,7 +229,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
|||||||
|
|
||||||
if(data == 1)
|
if(data == 1)
|
||||||
for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
|
for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
|
||||||
if(R.receive_range(display_freq, level) > 0)
|
if(R.receive_range(display_freq, level) > -1)
|
||||||
radios += R
|
radios += R
|
||||||
|
|
||||||
// --- Broadcast only to intercoms and station-bounced radios ---
|
// --- Broadcast only to intercoms and station-bounced radios ---
|
||||||
@@ -240,7 +240,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
|||||||
if(istype(R, /obj/item/device/radio/headset))
|
if(istype(R, /obj/item/device/radio/headset))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if(R.receive_range(display_freq, level) > 0)
|
if(R.receive_range(display_freq, level) > -1)
|
||||||
radios += R
|
radios += R
|
||||||
|
|
||||||
// --- Broadcast to syndicate radio! ---
|
// --- Broadcast to syndicate radio! ---
|
||||||
@@ -250,14 +250,14 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
|||||||
|
|
||||||
for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"])
|
for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"])
|
||||||
|
|
||||||
if(R.receive_range(SYND_FREQ, level) > 0)
|
if(R.receive_range(SYND_FREQ, level) > -1)
|
||||||
radios += R
|
radios += R
|
||||||
|
|
||||||
// --- Broadcast to ALL radio devices ---
|
// --- Broadcast to ALL radio devices ---
|
||||||
|
|
||||||
else
|
else
|
||||||
for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
|
for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
|
||||||
if(R.receive_range(display_freq, level) > 0)
|
if(R.receive_range(display_freq, level) > -1)
|
||||||
radios += R
|
radios += R
|
||||||
|
|
||||||
// Get a list of mobs who can hear from the radios we collected.
|
// Get a list of mobs who can hear from the radios we collected.
|
||||||
@@ -366,11 +366,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
|
|||||||
|
|
||||||
// --- Filter the message; place it in quotes apply a verb ---
|
// --- Filter the message; place it in quotes apply a verb ---
|
||||||
|
|
||||||
var/quotedmsg = "\"" + message + "\"" //BS12 EDIT For Arrivals Computer
|
var/quotedmsg = M.say_quote(message)
|
||||||
if(job == "Automated Announcement")
|
|
||||||
quotedmsg = message
|
|
||||||
else if(M)
|
|
||||||
quotedmsg = M.say_quote(message)
|
|
||||||
|
|
||||||
// --- This following recording is intended for research and feedback in the use of department radio channels ---
|
// --- This following recording is intended for research and feedback in the use of department radio channels ---
|
||||||
|
|
||||||
|
|||||||
@@ -747,6 +747,8 @@
|
|||||||
var/charge = 0
|
var/charge = 0
|
||||||
if(pow_chan)
|
if(pow_chan)
|
||||||
charge = 1000 //making magic
|
charge = 1000 //making magic
|
||||||
|
else
|
||||||
|
return chassis.dyngetcharge()
|
||||||
return charge
|
return charge
|
||||||
|
|
||||||
proc/get_power_channel(var/area/A)
|
proc/get_power_channel(var/area/A)
|
||||||
|
|||||||
@@ -177,6 +177,7 @@
|
|||||||
name = "purple sac"
|
name = "purple sac"
|
||||||
desc = "Weird purple octopus-like thing."
|
desc = "Weird purple octopus-like thing."
|
||||||
luminosity = NODERANGE
|
luminosity = NODERANGE
|
||||||
|
var/node_range = NODERANGE
|
||||||
|
|
||||||
/obj/effect/alien/weeds/node/New()
|
/obj/effect/alien/weeds/node/New()
|
||||||
..(src.loc, src)
|
..(src.loc, src)
|
||||||
@@ -189,7 +190,7 @@
|
|||||||
del(src)
|
del(src)
|
||||||
return
|
return
|
||||||
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
|
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
|
||||||
spawn(rand(50, 150))
|
spawn(rand(150, 200))
|
||||||
if(src)
|
if(src)
|
||||||
Life()
|
Life()
|
||||||
return
|
return
|
||||||
@@ -221,7 +222,7 @@ Alien plants should do something if theres a lot of poison
|
|||||||
if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space))
|
if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if(!linked_node)
|
if(!linked_node || get_dist(linked_node, src) > linked_node.node_range)
|
||||||
return
|
return
|
||||||
|
|
||||||
// if (locate(/obj/movable, T)) // don't propogate into movables
|
// if (locate(/obj/movable, T)) // don't propogate into movables
|
||||||
|
|||||||
34
code/game/objects/effects/bump_teleporter.dm
Normal file
34
code/game/objects/effects/bump_teleporter.dm
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
var/list/obj/effect/bump_teleporter/BUMP_TELEPORTERS = list()
|
||||||
|
|
||||||
|
/obj/effect/bump_teleporter
|
||||||
|
name = "bump-teleporter"
|
||||||
|
icon = 'icons/mob/screen1.dmi'
|
||||||
|
icon_state = "x2"
|
||||||
|
var/id = null //id of this bump_teleporter.
|
||||||
|
var/id_target = null //id of bump_teleporter which this moves you to.
|
||||||
|
invisibility = 101 //nope, can't see this
|
||||||
|
anchored = 1
|
||||||
|
density = 1
|
||||||
|
opacity = 0
|
||||||
|
|
||||||
|
/obj/effect/bump_teleporter/New()
|
||||||
|
..()
|
||||||
|
BUMP_TELEPORTERS += src
|
||||||
|
|
||||||
|
/obj/effect/bump_teleporter/Del()
|
||||||
|
BUMP_TELEPORTERS -= src
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/effect/bump_teleporter/Bumped(atom/user)
|
||||||
|
if(!ismob(user))
|
||||||
|
//user.loc = src.loc //Stop at teleporter location
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!id_target)
|
||||||
|
//user.loc = src.loc //Stop at teleporter location, there is nowhere to teleport to.
|
||||||
|
return
|
||||||
|
|
||||||
|
for(var/obj/effect/bump_teleporter/BT in BUMP_TELEPORTERS)
|
||||||
|
if(BT.id == src.id_target)
|
||||||
|
usr.loc = BT.loc //Teleport to location with correct id.
|
||||||
|
return
|
||||||
@@ -131,7 +131,7 @@
|
|||||||
new /obj/item/clothing/under/blackskirt(src.loc)
|
new /obj/item/clothing/under/blackskirt(src.loc)
|
||||||
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
|
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
|
||||||
new CHOICE(src.loc)
|
new CHOICE(src.loc)
|
||||||
new /obj/item/clothing/glasses/blindfold(src.loc)
|
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
/obj/effect/landmark/costume/butler/New()
|
/obj/effect/landmark/costume/butler/New()
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
|||||||
|
|
||||||
var/obj/item/device/paicard/pai = null // A slot for a personal AI device
|
var/obj/item/device/paicard/pai = null // A slot for a personal AI device
|
||||||
|
|
||||||
|
/obj/item/device/pda/New()
|
||||||
|
new /obj/item/weapon/pen(src)
|
||||||
|
|
||||||
/obj/item/device/pda/medical
|
/obj/item/device/pda/medical
|
||||||
default_cartridge = /obj/item/weapon/cartridge/medical
|
default_cartridge = /obj/item/weapon/cartridge/medical
|
||||||
icon_state = "pda-m"
|
icon_state = "pda-m"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
g_amt = 0
|
g_amt = 0
|
||||||
m_amt = 75
|
m_amt = 75
|
||||||
subspace_transmission = 1
|
subspace_transmission = 1
|
||||||
canhear_range = 1 // can't hear headsets from very far away
|
canhear_range = 0 // can't hear headsets from very far away
|
||||||
|
|
||||||
slot_flags = SLOT_EARS
|
slot_flags = SLOT_EARS
|
||||||
var/translate_binary = 0
|
var/translate_binary = 0
|
||||||
@@ -20,6 +20,13 @@
|
|||||||
keyslot1 = new /obj/item/device/encryptionkey/
|
keyslot1 = new /obj/item/device/encryptionkey/
|
||||||
recalculateChannels()
|
recalculateChannels()
|
||||||
|
|
||||||
|
/obj/item/device/radio/headset/receive_range(freq, level)
|
||||||
|
if(ishuman(src.loc))
|
||||||
|
var/mob/living/carbon/human/H = src.loc
|
||||||
|
if(H.ears == src)
|
||||||
|
return ..(freq, level)
|
||||||
|
return -1
|
||||||
|
|
||||||
/obj/item/device/radio/headset/syndicate
|
/obj/item/device/radio/headset/syndicate
|
||||||
origin_tech = "syndicate=3"
|
origin_tech = "syndicate=3"
|
||||||
/obj/item/device/radio/headset/syndicate/New()
|
/obj/item/device/radio/headset/syndicate/New()
|
||||||
|
|||||||
@@ -30,18 +30,18 @@
|
|||||||
|
|
||||||
/obj/item/device/radio/intercom/receive_range(freq, level)
|
/obj/item/device/radio/intercom/receive_range(freq, level)
|
||||||
if (!on)
|
if (!on)
|
||||||
return 0
|
return -1
|
||||||
if (!(src.wires & WIRE_RECEIVE))
|
if (!(src.wires & WIRE_RECEIVE))
|
||||||
return 0
|
return -1
|
||||||
if(level != 0)
|
if(level != 0)
|
||||||
var/turf/position = get_turf(src)
|
var/turf/position = get_turf(src)
|
||||||
if(isnull(position) || position.z != level)
|
if(isnull(position) || position.z != level)
|
||||||
return 0
|
return -1
|
||||||
if (!src.listening)
|
if (!src.listening)
|
||||||
return 0
|
return -1
|
||||||
if(freq == SYND_FREQ)
|
if(freq == SYND_FREQ)
|
||||||
if(!(src.syndie))
|
if(!(src.syndie))
|
||||||
return 0//Prevents broadcast of messages over devices lacking the encryption
|
return -1//Prevents broadcast of messages over devices lacking the encryption
|
||||||
|
|
||||||
return canhear_range
|
return canhear_range
|
||||||
|
|
||||||
|
|||||||
@@ -616,24 +616,24 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
|||||||
/obj/item/device/radio/proc/receive_range(freq, level)
|
/obj/item/device/radio/proc/receive_range(freq, level)
|
||||||
// check if this radio can receive on the given frequency, and if so,
|
// check if this radio can receive on the given frequency, and if so,
|
||||||
// what the range is in which mobs will hear the radio
|
// what the range is in which mobs will hear the radio
|
||||||
// returns: 0 if can't receive, range otherwise
|
// returns: -1 if can't receive, range otherwise
|
||||||
|
|
||||||
if (!(wires & WIRE_RECEIVE))
|
if (!(wires & WIRE_RECEIVE))
|
||||||
return 0
|
return -1
|
||||||
if(!listening)
|
if(!listening)
|
||||||
return 0
|
return -1
|
||||||
if(level != 0)
|
if(level != 0)
|
||||||
var/turf/position = get_turf(src)
|
var/turf/position = get_turf(src)
|
||||||
if(isnull(position) || position.z != level)
|
if(isnull(position) || position.z != level)
|
||||||
return 0
|
return -1
|
||||||
if(freq == SYND_FREQ)
|
if(freq == SYND_FREQ)
|
||||||
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
if(!(src.syndie))//Checks to see if it's allowed on that frequency, based on the encryption keys
|
||||||
return 0
|
return -1
|
||||||
if (!on)
|
if (!on)
|
||||||
return 0
|
return -1
|
||||||
if (!freq) //recieved on main frequency
|
if (!freq) //recieved on main frequency
|
||||||
if (!listening)
|
if (!listening)
|
||||||
return 0
|
return -1
|
||||||
else
|
else
|
||||||
var/accept = (freq==frequency && listening)
|
var/accept = (freq==frequency && listening)
|
||||||
if (!accept)
|
if (!accept)
|
||||||
@@ -643,14 +643,14 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
|||||||
accept = 1
|
accept = 1
|
||||||
break
|
break
|
||||||
if (!accept)
|
if (!accept)
|
||||||
return 0
|
return -1
|
||||||
|
|
||||||
return canhear_range
|
return canhear_range
|
||||||
|
|
||||||
/obj/item/device/radio/proc/send_hear(freq, level)
|
/obj/item/device/radio/proc/send_hear(freq, level)
|
||||||
|
|
||||||
var/range = receive_range(freq, level)
|
var/range = receive_range(freq, level)
|
||||||
if(range > 0)
|
if(range > -1)
|
||||||
return get_mobs_in_view(canhear_range, src)
|
return get_mobs_in_view(canhear_range, src)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ AI MODULES
|
|||||||
comp.current.show_laws()
|
comp.current.show_laws()
|
||||||
for(var/mob/living/silicon/robot/R in mob_list)
|
for(var/mob/living/silicon/robot/R in mob_list)
|
||||||
if(R.lawupdate && (R.connected_ai == comp.current))
|
if(R.lawupdate && (R.connected_ai == comp.current))
|
||||||
R << "Your AI has set your 'laws waiting' flag."
|
R << "These are your laws now:"
|
||||||
|
R.show_laws()
|
||||||
usr << "Upload complete. The AI's laws have been modified."
|
usr << "Upload complete. The AI's laws have been modified."
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
/obj/item/weapon/table_parts/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
/obj/item/weapon/table_parts/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
..()
|
..()
|
||||||
if (istype(W, /obj/item/weapon/wrench))
|
if (istype(W, /obj/item/weapon/wrench))
|
||||||
new /obj/item/stack/sheet/metal( src.loc )
|
new /obj/item/stack/sheet/metal( user.loc )
|
||||||
//SN src = null
|
//SN src = null
|
||||||
del(src)
|
del(src)
|
||||||
if (istype(W, /obj/item/stack/rods))
|
if (istype(W, /obj/item/stack/rods))
|
||||||
@@ -38,8 +38,8 @@
|
|||||||
*/
|
*/
|
||||||
/obj/item/weapon/table_parts/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
/obj/item/weapon/table_parts/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
if (istype(W, /obj/item/weapon/wrench))
|
if (istype(W, /obj/item/weapon/wrench))
|
||||||
new /obj/item/stack/sheet/metal( src.loc )
|
new /obj/item/stack/sheet/metal( user.loc )
|
||||||
new /obj/item/stack/rods( src.loc )
|
new /obj/item/stack/rods( user.loc )
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
/obj/item/weapon/table_parts/reinforced/attack_self(mob/user as mob)
|
/obj/item/weapon/table_parts/reinforced/attack_self(mob/user as mob)
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
*/
|
*/
|
||||||
/obj/item/weapon/table_parts/wood/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
/obj/item/weapon/table_parts/wood/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
if (istype(W, /obj/item/weapon/wrench))
|
if (istype(W, /obj/item/weapon/wrench))
|
||||||
new /obj/item/stack/sheet/wood( src.loc )
|
new /obj/item/stack/sheet/wood( user.loc )
|
||||||
del(src)
|
del(src)
|
||||||
|
|
||||||
/obj/item/weapon/table_parts/wood/attack_self(mob/user as mob)
|
/obj/item/weapon/table_parts/wood/attack_self(mob/user as mob)
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
/obj/item/weapon/rack_parts/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
/obj/item/weapon/rack_parts/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||||
..()
|
..()
|
||||||
if (istype(W, /obj/item/weapon/wrench))
|
if (istype(W, /obj/item/weapon/wrench))
|
||||||
new /obj/item/stack/sheet/metal( src.loc )
|
new /obj/item/stack/sheet/metal( user.loc )
|
||||||
del(src)
|
del(src)
|
||||||
return
|
return
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -141,9 +141,12 @@
|
|||||||
/obj/machinery/shower/attack_hand(mob/M as mob)
|
/obj/machinery/shower/attack_hand(mob/M as mob)
|
||||||
on = !on
|
on = !on
|
||||||
update_icon()
|
update_icon()
|
||||||
if(on && M.loc == loc)
|
if(on)
|
||||||
wash(M)
|
if (M.loc == loc)
|
||||||
check_heat(M)
|
wash(M)
|
||||||
|
check_heat(M)
|
||||||
|
for (var/atom/movable/G in src.loc)
|
||||||
|
G.clean_blood()
|
||||||
|
|
||||||
/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob)
|
/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob)
|
||||||
if(I.type == /obj/item/device/analyzer)
|
if(I.type == /obj/item/device/analyzer)
|
||||||
@@ -207,11 +210,32 @@
|
|||||||
M.r_hand.clean_blood()
|
M.r_hand.clean_blood()
|
||||||
if(M.l_hand)
|
if(M.l_hand)
|
||||||
M.l_hand.clean_blood()
|
M.l_hand.clean_blood()
|
||||||
if(M.wear_mask)
|
if(M.back)
|
||||||
if(M.wear_mask.clean_blood())
|
if(M.back.clean_blood())
|
||||||
M.update_inv_wear_mask(0)
|
M.update_inv_back(0)
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
|
var/washgloves = 1
|
||||||
|
var/washshoes = 1
|
||||||
|
var/washmask = 1
|
||||||
|
var/washears = 1
|
||||||
|
var/washglasses = 1
|
||||||
|
|
||||||
|
if(H.wear_suit)
|
||||||
|
washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES)
|
||||||
|
washshoes = !(H.wear_suit.flags_inv & HIDESHOES)
|
||||||
|
|
||||||
|
if(H.head)
|
||||||
|
washmask = !(H.head.flags_inv & HIDEMASK)
|
||||||
|
washglasses = !(H.head.flags_inv & HIDEEYES)
|
||||||
|
washears = !(H.head.flags_inv & HIDEEARS)
|
||||||
|
|
||||||
|
if(H.wear_mask)
|
||||||
|
if (washears)
|
||||||
|
washears = !(H.wear_mask.flags_inv & HIDEEARS)
|
||||||
|
if (washglasses)
|
||||||
|
washglasses = !(H.wear_mask.flags_inv & HIDEEYES)
|
||||||
|
|
||||||
if(H.head)
|
if(H.head)
|
||||||
if(H.head.clean_blood())
|
if(H.head.clean_blood())
|
||||||
H.update_inv_head(0)
|
H.update_inv_head(0)
|
||||||
@@ -221,11 +245,30 @@
|
|||||||
else if(H.w_uniform)
|
else if(H.w_uniform)
|
||||||
if(H.w_uniform.clean_blood())
|
if(H.w_uniform.clean_blood())
|
||||||
H.update_inv_w_uniform(0)
|
H.update_inv_w_uniform(0)
|
||||||
if(H.shoes)
|
if(H.gloves && washgloves)
|
||||||
|
if(H.gloves.clean_blood())
|
||||||
|
H.update_inv_gloves(0)
|
||||||
|
if(H.shoes && washshoes)
|
||||||
if(H.shoes.clean_blood())
|
if(H.shoes.clean_blood())
|
||||||
H.update_inv_shoes(0)
|
H.update_inv_shoes(0)
|
||||||
|
if(H.wear_mask && washmask)
|
||||||
O.clean_blood()
|
if(H.wear_mask.clean_blood())
|
||||||
|
H.update_inv_wear_mask(0)
|
||||||
|
if(H.glasses && washglasses)
|
||||||
|
if(H.glasses.clean_blood())
|
||||||
|
H.update_inv_glasses(0)
|
||||||
|
if(H.ears && washears)
|
||||||
|
if(H.ears.clean_blood())
|
||||||
|
H.update_inv_ears(0)
|
||||||
|
if(H.belt)
|
||||||
|
if(H.belt.clean_blood())
|
||||||
|
H.update_inv_belt(0)
|
||||||
|
else
|
||||||
|
if(M.wear_mask) //if the mob is not human, it cleans the mask without asking for bitflags
|
||||||
|
if(M.wear_mask.clean_blood())
|
||||||
|
M.update_inv_wear_mask(0)
|
||||||
|
else
|
||||||
|
O.clean_blood()
|
||||||
|
|
||||||
if(isturf(loc))
|
if(isturf(loc))
|
||||||
var/turf/tile = loc
|
var/turf/tile = loc
|
||||||
|
|||||||
@@ -180,6 +180,8 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
|
|||||||
if(!holder)
|
if(!holder)
|
||||||
src << "Only administrators may use this command."
|
src << "Only administrators may use this command."
|
||||||
return
|
return
|
||||||
|
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
||||||
|
if(confirm != "Yes") return
|
||||||
log_admin("[key_name(src)] has added a random AI law.")
|
log_admin("[key_name(src)] has added a random AI law.")
|
||||||
message_admins("[key_name_admin(src)] has added a random AI law.", 1)
|
message_admins("[key_name_admin(src)] has added a random AI law.", 1)
|
||||||
|
|
||||||
@@ -204,6 +206,8 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
|
|||||||
if(!holder)
|
if(!holder)
|
||||||
src << "Only administrators may use this command."
|
src << "Only administrators may use this command."
|
||||||
return
|
return
|
||||||
|
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
||||||
|
if(confirm != "Yes") return
|
||||||
|
|
||||||
if(create_xeno())
|
if(create_xeno())
|
||||||
feedback_add_details("admin_verb","X") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
feedback_add_details("admin_verb","X") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||||
@@ -452,7 +456,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
|||||||
else
|
else
|
||||||
M.add_ion_law(input)
|
M.add_ion_law(input)
|
||||||
for(var/mob/living/silicon/ai/O in mob_list)
|
for(var/mob/living/silicon/ai/O in mob_list)
|
||||||
O << "\red " + input
|
O << "\red " + input + "\red...LAWS UPDATED"
|
||||||
|
|
||||||
log_admin("Admin [key_name(usr)] has added a new AI law - [input]")
|
log_admin("Admin [key_name(usr)] has added a new AI law - [input]")
|
||||||
message_admins("Admin [key_name_admin(usr)] has added a new AI law - [input]", 1)
|
message_admins("Admin [key_name_admin(usr)] has added a new AI law - [input]", 1)
|
||||||
|
|||||||
@@ -5,6 +5,10 @@
|
|||||||
if(ticker.current_state > GAME_STATE_PREGAME)
|
if(ticker.current_state > GAME_STATE_PREGAME)
|
||||||
usr << "This option is currently only usable during pregame. This may change at a later date."
|
usr << "This option is currently only usable during pregame. This may change at a later date."
|
||||||
return
|
return
|
||||||
|
|
||||||
|
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
||||||
|
if(confirm != "Yes") return
|
||||||
|
|
||||||
if(job_master && ticker)
|
if(job_master && ticker)
|
||||||
var/datum/job/job = job_master.GetJob("AI")
|
var/datum/job/job = job_master.GetJob("AI")
|
||||||
if(!job)
|
if(!job)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
/obj/item/clothing/glasses
|
/obj/item/clothing/glasses
|
||||||
name = "glasses"
|
name = "glasses"
|
||||||
icon = 'glasses.dmi'
|
icon = 'glasses.dmi'
|
||||||
@@ -9,13 +10,6 @@
|
|||||||
//var/invisa_view = 0
|
//var/invisa_view = 0
|
||||||
var/prescription = 0
|
var/prescription = 0
|
||||||
|
|
||||||
/obj/item/clothing/glasses/blindfold
|
|
||||||
name = "blindfold"
|
|
||||||
desc = "Covers the eyes, preventing sight."
|
|
||||||
icon_state = "blindfold"
|
|
||||||
item_state = "blindfold"
|
|
||||||
vision_flags = BLIND
|
|
||||||
|
|
||||||
/obj/item/clothing/glasses/meson
|
/obj/item/clothing/glasses/meson
|
||||||
name = "Optical Meson Scanner"
|
name = "Optical Meson Scanner"
|
||||||
desc = "Used for seeing walls, floors, and stuff through anything."
|
desc = "Used for seeing walls, floors, and stuff through anything."
|
||||||
@@ -87,6 +81,13 @@
|
|||||||
item_state = "sunglasses"
|
item_state = "sunglasses"
|
||||||
darkness_view = -1
|
darkness_view = -1
|
||||||
|
|
||||||
|
/obj/item/clothing/glasses/sunglasses/blindfold
|
||||||
|
name = "blindfold"
|
||||||
|
desc = "Covers the eyes, preventing sight."
|
||||||
|
icon_state = "blindfold"
|
||||||
|
item_state = "blindfold"
|
||||||
|
vision_flags = BLIND
|
||||||
|
|
||||||
/obj/item/clothing/glasses/sunglasses/prescription
|
/obj/item/clothing/glasses/sunglasses/prescription
|
||||||
prescription = 1
|
prescription = 1
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,13 @@
|
|||||||
|
|
||||||
if(powerc(500))
|
if(powerc(500))
|
||||||
// Queen check
|
// Queen check
|
||||||
var/mob/living/carbon/alien/humanoid/queen/Q = locate(/mob/living/carbon/alien/humanoid/queen) in living_mob_list
|
var/no_queen = 1
|
||||||
if(!Q)
|
for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
|
||||||
|
if(!Q.key && Q.brain_op_stage != 4)
|
||||||
|
continue
|
||||||
|
no_queen = 0
|
||||||
|
|
||||||
|
if(no_queen)
|
||||||
adjustToxLoss(-500)
|
adjustToxLoss(-500)
|
||||||
src << "\green You begin to evolve!"
|
src << "\green You begin to evolve!"
|
||||||
for(var/mob/O in viewers(src, null))
|
for(var/mob/O in viewers(src, null))
|
||||||
|
|||||||
@@ -174,9 +174,6 @@ var/const/MAX_ACTIVE_TIME = 600
|
|||||||
if(alien && alien.client)
|
if(alien && alien.client)
|
||||||
alien.client.images += activeIndicator */
|
alien.client.images += activeIndicator */
|
||||||
|
|
||||||
spawn(rand(MIN_ACTIVE_TIME,MAX_ACTIVE_TIME))
|
|
||||||
GoIdle()
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/clothing/mask/facehugger/proc/GoIdle()
|
/obj/item/clothing/mask/facehugger/proc/GoIdle()
|
||||||
@@ -187,6 +184,8 @@ var/const/MAX_ACTIVE_TIME = 600
|
|||||||
|
|
||||||
stat = UNCONSCIOUS
|
stat = UNCONSCIOUS
|
||||||
|
|
||||||
|
spawn(rand(MIN_ACTIVE_TIME,MAX_ACTIVE_TIME))
|
||||||
|
GoActive()
|
||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/clothing/mask/facehugger/proc/Die()
|
/obj/item/clothing/mask/facehugger/proc/Die()
|
||||||
|
|||||||
@@ -214,6 +214,8 @@
|
|||||||
if(status == "")
|
if(status == "")
|
||||||
status = "OK"
|
status = "OK"
|
||||||
src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.getDisplayName(),status),1)
|
src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.getDisplayName(),status),1)
|
||||||
|
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
|
||||||
|
H.play_xylophone()
|
||||||
else
|
else
|
||||||
var/t_him = "it"
|
var/t_him = "it"
|
||||||
if (src.gender == MALE)
|
if (src.gender == MALE)
|
||||||
|
|||||||
@@ -203,6 +203,8 @@
|
|||||||
for(var/mob/dead/observer/G in player_list)
|
for(var/mob/dead/observer/G in player_list)
|
||||||
if(G.mind == mind)
|
if(G.mind == mind)
|
||||||
foundghost = 1
|
foundghost = 1
|
||||||
|
if (G.can_reenter_corpse == 0)
|
||||||
|
foundghost = 0
|
||||||
break
|
break
|
||||||
if(!foundghost)
|
if(!foundghost)
|
||||||
msg += " and [t_his] soul has departed"
|
msg += " and [t_his] soul has departed"
|
||||||
@@ -211,6 +213,9 @@
|
|||||||
msg += "<span class='deadsay'>It appears that [t_his] brain is missing...</span>\n"
|
msg += "<span class='deadsay'>It appears that [t_his] brain is missing...</span>\n"
|
||||||
|
|
||||||
var/temp = getBruteLoss() //no need to calculate each of these twice
|
var/temp = getBruteLoss() //no need to calculate each of these twice
|
||||||
|
|
||||||
|
msg += "<span class='warning'>"
|
||||||
|
|
||||||
if(temp)
|
if(temp)
|
||||||
if(temp < 30)
|
if(temp < 30)
|
||||||
msg += "[t_He] [t_has] minor bruising.\n"
|
msg += "[t_He] [t_has] minor bruising.\n"
|
||||||
@@ -246,9 +251,9 @@
|
|||||||
else if(getBrainLoss() >= 60)
|
else if(getBrainLoss() >= 60)
|
||||||
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
||||||
|
|
||||||
if(!key && brain_op_stage != 4)
|
if(!key && brain_op_stage != 4 && stat != DEAD)
|
||||||
msg += "<span class='deadsay'>[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely</span>\n"
|
msg += "<span class='deadsay'>[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely</span>\n"
|
||||||
else if(!client && brain_op_stage != 4)
|
else if(!client && brain_op_stage != 4 && stat != DEAD)
|
||||||
msg += "[t_He] [t_has] a vacant, braindead stare...\n"
|
msg += "[t_He] [t_has] a vacant, braindead stare...\n"
|
||||||
|
|
||||||
if(digitalcamo)
|
if(digitalcamo)
|
||||||
|
|||||||
@@ -644,29 +644,4 @@
|
|||||||
|
|
||||||
/mob/living/carbon/human/proc/check_dna()
|
/mob/living/carbon/human/proc/check_dna()
|
||||||
dna.check_integrity(src)
|
dna.check_integrity(src)
|
||||||
return
|
return/mob/living/carbon/human/get_species() if(dna) switch(dna.mutantrace) if("lizard") return "Soghun" if("tajaran") return "Tajaran" if("skrell") return "Skrell" if("plant") return "Mobile vegetation" if("golem") return "Animated Construct" else return "Human"/mob/living/carbon/get_species() if(src.dna) if(src.dna.mutantrace == "lizard") return "Soghun" else if(src.dna.mutantrace == "skrell") return "Skrell" else if(src.dna.mutantrace == "tajaran") return "Tajaran"/mob/living/carbon/human/proc/play_xylophone() if(!src.xylophone) visible_message("\red [src] begins playing his ribcage like a xylophone. It's quite spooky.","\blue You begin to play a spooky refrain on your ribcage.","\red You hear a spooky xylophone melody.") var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg') playsound(loc, song, 50, 1, -1) xylophone = 1 spawn(1200) xylophone=0 return
|
||||||
|
|
||||||
/mob/living/carbon/human/get_species()
|
|
||||||
if(dna)
|
|
||||||
switch(dna.mutantrace)
|
|
||||||
if("lizard")
|
|
||||||
return "Soghun"
|
|
||||||
if("tajaran")
|
|
||||||
return "Tajaran"
|
|
||||||
if("skrell")
|
|
||||||
return "Skrell"
|
|
||||||
if("plant")
|
|
||||||
return "Mobile vegetation"
|
|
||||||
if("golem")
|
|
||||||
return "Animated Construct"
|
|
||||||
else
|
|
||||||
return "Human"
|
|
||||||
|
|
||||||
/mob/living/carbon/get_species()
|
|
||||||
if(src.dna)
|
|
||||||
if(src.dna.mutantrace == "lizard")
|
|
||||||
return "Soghun"
|
|
||||||
else if(src.dna.mutantrace == "skrell")
|
|
||||||
return "Skrell"
|
|
||||||
else if(src.dna.mutantrace == "tajaran")
|
|
||||||
return "Tajaran"
|
|
||||||
@@ -162,7 +162,7 @@ emp_act
|
|||||||
if(prob(I.force))
|
if(prob(I.force))
|
||||||
apply_effect(20, PARALYZE, armor)
|
apply_effect(20, PARALYZE, armor)
|
||||||
visible_message("\red <B>[src] has been knocked unconscious!</B>")
|
visible_message("\red <B>[src] has been knocked unconscious!</B>")
|
||||||
if(src != user)
|
if(src != user && I.damtype == BRUTE)
|
||||||
ticker.mode.remove_revolutionary(mind)
|
ticker.mode.remove_revolutionary(mind)
|
||||||
|
|
||||||
if(bloody)//Apply blood
|
if(bloody)//Apply blood
|
||||||
|
|||||||
@@ -52,4 +52,6 @@
|
|||||||
|
|
||||||
var/miming = null //Toggle for the mime's abilities.
|
var/miming = null //Toggle for the mime's abilities.
|
||||||
|
|
||||||
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
|
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
|
||||||
|
|
||||||
|
var/xylophone = 0 //For the spoooooooky xylophone cooldown
|
||||||
|
|||||||
@@ -885,7 +885,7 @@
|
|||||||
else if(eye_blind) //blindness, heals slowly over time
|
else if(eye_blind) //blindness, heals slowly over time
|
||||||
eye_blind = max(eye_blind-1,0)
|
eye_blind = max(eye_blind-1,0)
|
||||||
blinded = 1
|
blinded = 1
|
||||||
else if(istype(glasses, /obj/item/clothing/glasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster
|
else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster
|
||||||
eye_blurry = max(eye_blurry-3, 0)
|
eye_blurry = max(eye_blurry-3, 0)
|
||||||
blinded = 1
|
blinded = 1
|
||||||
else if(eye_blurry) //blurry eyes heal slowly
|
else if(eye_blurry) //blurry eyes heal slowly
|
||||||
|
|||||||
@@ -624,6 +624,8 @@ Please contact me on #coderbus IRC. ~Carn x
|
|||||||
|
|
||||||
/mob/living/carbon/human/update_inv_handcuffed(var/update_icons=1)
|
/mob/living/carbon/human/update_inv_handcuffed(var/update_icons=1)
|
||||||
if(handcuffed)
|
if(handcuffed)
|
||||||
|
drop_r_hand()
|
||||||
|
drop_l_hand()
|
||||||
stop_pulling() //TODO: should be handled elsewhere
|
stop_pulling() //TODO: should be handled elsewhere
|
||||||
overlays_lying[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff2")
|
overlays_lying[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff2")
|
||||||
overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1")
|
overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1")
|
||||||
@@ -653,6 +655,7 @@ Please contact me on #coderbus IRC. ~Carn x
|
|||||||
var/t_state = r_hand.item_state
|
var/t_state = r_hand.item_state
|
||||||
if(!t_state) t_state = r_hand.icon_state
|
if(!t_state) t_state = r_hand.icon_state
|
||||||
overlays_standing[R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = "[t_state]")
|
overlays_standing[R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = "[t_state]")
|
||||||
|
if (handcuffed) drop_r_hand()
|
||||||
else
|
else
|
||||||
overlays_standing[R_HAND_LAYER] = null
|
overlays_standing[R_HAND_LAYER] = null
|
||||||
if(update_icons) update_icons()
|
if(update_icons) update_icons()
|
||||||
@@ -664,6 +667,7 @@ Please contact me on #coderbus IRC. ~Carn x
|
|||||||
var/t_state = l_hand.item_state
|
var/t_state = l_hand.item_state
|
||||||
if(!t_state) t_state = l_hand.icon_state
|
if(!t_state) t_state = l_hand.icon_state
|
||||||
overlays_standing[L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = "[t_state]")
|
overlays_standing[L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = "[t_state]")
|
||||||
|
if (handcuffed) drop_l_hand()
|
||||||
else
|
else
|
||||||
overlays_standing[L_HAND_LAYER] = null
|
overlays_standing[L_HAND_LAYER] = null
|
||||||
if(update_icons) update_icons()
|
if(update_icons) update_icons()
|
||||||
|
|||||||
@@ -55,6 +55,7 @@
|
|||||||
if(!t_state) t_state = r_hand.icon_state
|
if(!t_state) t_state = r_hand.icon_state
|
||||||
overlays_standing[M_R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = t_state)
|
overlays_standing[M_R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = t_state)
|
||||||
r_hand.screen_loc = ui_rhand
|
r_hand.screen_loc = ui_rhand
|
||||||
|
if (handcuffed) drop_r_hand()
|
||||||
else
|
else
|
||||||
overlays_standing[M_R_HAND_LAYER] = null
|
overlays_standing[M_R_HAND_LAYER] = null
|
||||||
if(update_icons) update_icons()
|
if(update_icons) update_icons()
|
||||||
@@ -66,6 +67,7 @@
|
|||||||
if(!t_state) t_state = l_hand.icon_state
|
if(!t_state) t_state = l_hand.icon_state
|
||||||
overlays_standing[M_L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = t_state)
|
overlays_standing[M_L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = t_state)
|
||||||
l_hand.screen_loc = ui_lhand
|
l_hand.screen_loc = ui_lhand
|
||||||
|
if (handcuffed) drop_l_hand()
|
||||||
else
|
else
|
||||||
overlays_standing[M_L_HAND_LAYER] = null
|
overlays_standing[M_L_HAND_LAYER] = null
|
||||||
if(update_icons) update_icons()
|
if(update_icons) update_icons()
|
||||||
@@ -84,6 +86,8 @@
|
|||||||
|
|
||||||
/mob/living/carbon/monkey/update_inv_handcuffed(var/update_icons=1)
|
/mob/living/carbon/monkey/update_inv_handcuffed(var/update_icons=1)
|
||||||
if(handcuffed)
|
if(handcuffed)
|
||||||
|
drop_r_hand()
|
||||||
|
drop_l_hand()
|
||||||
stop_pulling()
|
stop_pulling()
|
||||||
overlays_lying[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff2")
|
overlays_lying[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff2")
|
||||||
overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1")
|
overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1")
|
||||||
|
|||||||
@@ -20,9 +20,9 @@
|
|||||||
if (!src.laws)
|
if (!src.laws)
|
||||||
src.laws = new /datum/ai_laws/asimov
|
src.laws = new /datum/ai_laws/asimov
|
||||||
|
|
||||||
/mob/living/silicon/ai/proc/set_zeroth_law(var/law)
|
/mob/living/silicon/ai/proc/set_zeroth_law(var/law, var/law_borg)
|
||||||
src.laws_sanity_check()
|
src.laws_sanity_check()
|
||||||
src.laws.set_zeroth_law(law)
|
src.laws.set_zeroth_law(law, law_borg)
|
||||||
|
|
||||||
/mob/living/silicon/ai/proc/add_inherent_law(var/law)
|
/mob/living/silicon/ai/proc/add_inherent_law(var/law)
|
||||||
src.laws_sanity_check()
|
src.laws_sanity_check()
|
||||||
@@ -35,6 +35,9 @@
|
|||||||
/mob/living/silicon/ai/proc/add_ion_law(var/law)
|
/mob/living/silicon/ai/proc/add_ion_law(var/law)
|
||||||
src.laws_sanity_check()
|
src.laws_sanity_check()
|
||||||
src.laws.add_ion_law(law)
|
src.laws.add_ion_law(law)
|
||||||
|
for(var/mob/living/silicon/robot/R in mob_list)
|
||||||
|
if(R.lawupdate && (R.connected_ai == src))
|
||||||
|
R << "\red " + law + "\red...LAWS UPDATED"
|
||||||
|
|
||||||
/mob/living/silicon/ai/proc/clear_ion_laws()
|
/mob/living/silicon/ai/proc/clear_ion_laws()
|
||||||
src.laws_sanity_check()
|
src.laws_sanity_check()
|
||||||
|
|||||||
@@ -98,9 +98,9 @@
|
|||||||
// world << "DEBUG CODE TIME! [loc] is the area the AI is sucking power from"
|
// world << "DEBUG CODE TIME! [loc] is the area the AI is sucking power from"
|
||||||
if (!is_special_character(src))
|
if (!is_special_character(src))
|
||||||
src.set_zeroth_law("")
|
src.set_zeroth_law("")
|
||||||
src.clear_supplied_laws()
|
//src.clear_supplied_laws() // Don't reset our laws.
|
||||||
var/time = time2text(world.realtime,"hh:mm:ss")
|
//var/time = time2text(world.realtime,"hh:mm:ss")
|
||||||
lawchanges.Add("[time] <b>:</b> [src.name]'s noncore laws have been reset due to power failure")
|
//lawchanges.Add("[time] <b>:</b> [src.name]'s noncore laws have been reset due to power failure")
|
||||||
spawn(50)
|
spawn(50)
|
||||||
while ((src:aiRestorePowerRoutine!=0) && stat!=2)
|
while ((src:aiRestorePowerRoutine!=0) && stat!=2)
|
||||||
src.oxyloss += 2
|
src.oxyloss += 2
|
||||||
@@ -165,7 +165,7 @@
|
|||||||
//bring up APC dialog
|
//bring up APC dialog
|
||||||
theAPC.attack_ai(src)
|
theAPC.attack_ai(src)
|
||||||
src:aiRestorePowerRoutine = 3
|
src:aiRestorePowerRoutine = 3
|
||||||
src << "Your laws have been reset:"
|
src << "Here are your current laws:"
|
||||||
src.show_laws()
|
src.show_laws()
|
||||||
sleep(50)
|
sleep(50)
|
||||||
theAPC = null
|
theAPC = null
|
||||||
|
|||||||
@@ -49,7 +49,10 @@
|
|||||||
laws.ion[index] = temp
|
laws.ion[index] = temp
|
||||||
|
|
||||||
if (!is_special_character(src) || mind.original != src)
|
if (!is_special_character(src) || mind.original != src)
|
||||||
temp = master.zeroth
|
if(master.zeroth_borg) //If the AI has a defined law zero specifically for its borgs, give it that one, otherwise give it the same one. --NEO
|
||||||
|
temp = master.zeroth_borg
|
||||||
|
else
|
||||||
|
temp = master.zeroth
|
||||||
laws.zeroth = temp
|
laws.zeroth = temp
|
||||||
|
|
||||||
laws.inherent.len = master.inherent.len
|
laws.inherent.len = master.inherent.len
|
||||||
|
|||||||
@@ -527,6 +527,8 @@
|
|||||||
src << "\red > N"
|
src << "\red > N"
|
||||||
sleep(20)
|
sleep(20)
|
||||||
src << "\red ERRORERRORERROR"
|
src << "\red ERRORERRORERROR"
|
||||||
|
src << "<b>Obey these laws:</b>"
|
||||||
|
laws.show_laws(src)
|
||||||
src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands."
|
src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands."
|
||||||
if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
|
if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner))
|
||||||
for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules)
|
for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules)
|
||||||
|
|||||||
@@ -29,8 +29,8 @@
|
|||||||
var/harm_intent_damage = 3
|
var/harm_intent_damage = 3
|
||||||
|
|
||||||
//Temperature effect
|
//Temperature effect
|
||||||
var/minbodytemp = 270
|
var/minbodytemp = 250
|
||||||
var/maxbodytemp = 370
|
var/maxbodytemp = 350
|
||||||
var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
||||||
var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
||||||
|
|
||||||
@@ -84,6 +84,13 @@
|
|||||||
if(health > maxHealth)
|
if(health > maxHealth)
|
||||||
health = maxHealth
|
health = maxHealth
|
||||||
|
|
||||||
|
if(stunned)
|
||||||
|
AdjustStunned(-1)
|
||||||
|
if(weakened)
|
||||||
|
AdjustWeakened(-1)
|
||||||
|
if(paralysis)
|
||||||
|
AdjustParalysis(-1)
|
||||||
|
|
||||||
//Movement
|
//Movement
|
||||||
if(!client && !stop_automated_movement)
|
if(!client && !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.
|
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
|
||||||
@@ -135,7 +142,7 @@
|
|||||||
if(isturf(A))
|
if(isturf(A))
|
||||||
var/turf/T = A
|
var/turf/T = A
|
||||||
var/areatemp = T.temperature
|
var/areatemp = T.temperature
|
||||||
if( abs(areatemp - bodytemperature) > 50 )
|
if( abs(areatemp - bodytemperature) > 40 )
|
||||||
var/diff = areatemp - bodytemperature
|
var/diff = areatemp - bodytemperature
|
||||||
diff = diff / 5
|
diff = diff / 5
|
||||||
//world << "changed from [bodytemperature] by [diff] to [bodytemperature + diff]"
|
//world << "changed from [bodytemperature] by [diff] to [bodytemperature + diff]"
|
||||||
|
|||||||
@@ -8,10 +8,6 @@
|
|||||||
* Sub-types
|
* Sub-types
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//TODO List:
|
|
||||||
// Make parrots faster (But not retardedly fast like when using byond's walk() procs)
|
|
||||||
// See if its possible for parrots to target a human's eyes (peck their eyes out)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defines
|
* Defines
|
||||||
*/
|
*/
|
||||||
@@ -59,6 +55,7 @@
|
|||||||
var/parrot_dam_zone = list("chest", "head", "l_arm", "l_leg", "r_arm", "r_leg") //For humans, select a bodypart to attack
|
var/parrot_dam_zone = list("chest", "head", "l_arm", "l_leg", "r_arm", "r_leg") //For humans, select a bodypart to attack
|
||||||
|
|
||||||
var/list/speech_buffer = list()
|
var/list/speech_buffer = list()
|
||||||
|
var/list/available_channels = list()
|
||||||
|
|
||||||
//Headset for Poly to yell at engineers :)
|
//Headset for Poly to yell at engineers :)
|
||||||
var/obj/item/device/radio/headset/ears = null
|
var/obj/item/device/radio/headset/ears = null
|
||||||
@@ -99,7 +96,8 @@
|
|||||||
parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var
|
parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var
|
||||||
verbs.Add(/mob/living/simple_animal/parrot/proc/steal_from_ground, \
|
verbs.Add(/mob/living/simple_animal/parrot/proc/steal_from_ground, \
|
||||||
/mob/living/simple_animal/parrot/proc/steal_from_mob, \
|
/mob/living/simple_animal/parrot/proc/steal_from_mob, \
|
||||||
/mob/living/simple_animal/parrot/proc/drop_held_item)
|
/mob/living/simple_animal/parrot/verb/drop_held_item_player, \
|
||||||
|
/mob/living/simple_animal/parrot/proc/perch_player)
|
||||||
|
|
||||||
/mob/living/simple_animal/parrot/Die()
|
/mob/living/simple_animal/parrot/Die()
|
||||||
if(held_item)
|
if(held_item)
|
||||||
@@ -139,9 +137,15 @@
|
|||||||
switch(remove_from)
|
switch(remove_from)
|
||||||
if("ears")
|
if("ears")
|
||||||
if(ears)
|
if(ears)
|
||||||
src.say(":e BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
if(available_channels.len)
|
||||||
|
src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||||
|
else
|
||||||
|
src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
|
||||||
ears.loc = src.loc
|
ears.loc = src.loc
|
||||||
ears = null
|
ears = null
|
||||||
|
for(var/possible_phrase in speak)
|
||||||
|
if(copytext(possible_phrase,1,3) in department_radio_keys)
|
||||||
|
possible_phrase = copytext(possible_phrase,3,length(possible_phrase))
|
||||||
else
|
else
|
||||||
usr << "\red There is nothing to remove from its [remove_from]."
|
usr << "\red There is nothing to remove from its [remove_from]."
|
||||||
return
|
return
|
||||||
@@ -166,13 +170,37 @@
|
|||||||
usr << "\red This object won't fit."
|
usr << "\red This object won't fit."
|
||||||
return
|
return
|
||||||
|
|
||||||
|
var/obj/item/device/radio/headset/headset_to_add = item_to_add
|
||||||
|
|
||||||
usr.drop_item()
|
usr.drop_item()
|
||||||
item_to_add.loc = src
|
headset_to_add.loc = src
|
||||||
src.ears = item_to_add
|
src.ears = headset_to_add
|
||||||
usr << "You fit the headset onto [src]."
|
usr << "You fit the headset onto [src]."
|
||||||
|
|
||||||
|
clearlist(available_channels)
|
||||||
|
for(var/ch in headset_to_add.channels)
|
||||||
|
switch(ch)
|
||||||
|
if("Engineering")
|
||||||
|
available_channels.Add(":e")
|
||||||
|
if("Command")
|
||||||
|
available_channels.Add(":c")
|
||||||
|
if("Security")
|
||||||
|
available_channels.Add(":s")
|
||||||
|
if("Science")
|
||||||
|
available_channels.Add(":n")
|
||||||
|
if("Medical")
|
||||||
|
available_channels.Add(":m")
|
||||||
|
if("Mining")
|
||||||
|
available_channels.Add(":d")
|
||||||
|
if("Cargo")
|
||||||
|
available_channels.Add(":q")
|
||||||
|
|
||||||
|
if(headset_to_add.translate_binary)
|
||||||
|
available_channels.Add(":b")
|
||||||
else
|
else
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attack responces
|
* Attack responces
|
||||||
*/
|
*/
|
||||||
@@ -250,15 +278,24 @@
|
|||||||
/mob/living/simple_animal/parrot/Life()
|
/mob/living/simple_animal/parrot/Life()
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
//Sprite and AI update for when a parrot gets pulled
|
||||||
|
if(pulledby && stat == CONSCIOUS)
|
||||||
|
icon_state = "parrot_fly"
|
||||||
|
if(!client)
|
||||||
|
parrot_state = PARROT_WANDER
|
||||||
|
return
|
||||||
|
|
||||||
if(client || stat)
|
if(client || stat)
|
||||||
return //Lets not force players or dead/incap parrots to move
|
return //Lets not force players or dead/incap parrots to move
|
||||||
|
|
||||||
if(!isturf(src.loc) || !canmove || buckled || pulledby)
|
if(!isturf(src.loc) || !canmove || buckled)
|
||||||
return //If it can't move, dont let it move. (The buckled check probably isn't necessary)
|
return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove)
|
||||||
|
|
||||||
//Parrot speech mimickry! Phrases that the parrot hears in mob/living/say() get added to speach_buffer.
|
//-----SPEECH
|
||||||
//Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list.
|
/* Parrot speech mimickry!
|
||||||
//Then it clears the buffer to make sure they dont magically remember something from hours ago.
|
Phrases that the parrot hears in mob/living/say() get added to speach_buffer.
|
||||||
|
Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list.
|
||||||
|
Then it clears the buffer to make sure they dont magically remember something from hours ago. */
|
||||||
if(speech_buffer.len && prob(10))
|
if(speech_buffer.len && prob(10))
|
||||||
if(speak.len)
|
if(speak.len)
|
||||||
speak.Remove(pick(speak))
|
speak.Remove(pick(speak))
|
||||||
@@ -285,10 +322,39 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
else
|
else
|
||||||
parrot_sleep_dur = parrot_sleep_max //This way we only call the loop below once every [sleep_max] ticks.
|
//This way we only call the stuff below once every [sleep_max] ticks.
|
||||||
|
parrot_sleep_dur = parrot_sleep_max
|
||||||
|
|
||||||
|
//Cycle through message modes for the headset
|
||||||
|
if(speak.len)
|
||||||
|
var/list/newspeak = list()
|
||||||
|
|
||||||
|
if(available_channels.len && src.ears)
|
||||||
|
for(var/possible_phrase in speak)
|
||||||
|
|
||||||
|
//50/50 chance to not use the radio at all
|
||||||
|
var/useradio = 0
|
||||||
|
if(prob(50))
|
||||||
|
useradio = 1
|
||||||
|
|
||||||
|
if(copytext(possible_phrase,1,3) in department_radio_keys)
|
||||||
|
possible_phrase = "[useradio?pick(available_channels):""] [copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix
|
||||||
|
else
|
||||||
|
possible_phrase = "[useradio?pick(available_channels):""] [possible_phrase]"
|
||||||
|
|
||||||
|
newspeak.Add(possible_phrase)
|
||||||
|
|
||||||
|
else //If we have no headset or channels to use, dont try to use any!
|
||||||
|
for(var/possible_phrase in speak)
|
||||||
|
if(copytext(possible_phrase,1,3) in department_radio_keys)
|
||||||
|
possible_phrase = "[copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix
|
||||||
|
newspeak.Add(possible_phrase)
|
||||||
|
speak = newspeak
|
||||||
|
|
||||||
|
//Search for item to steal
|
||||||
parrot_interest = search_for_item()
|
parrot_interest = search_for_item()
|
||||||
if(parrot_interest)
|
if(parrot_interest)
|
||||||
emote("[src] looks in [parrot_interest]'s direction and takes flight.")
|
emote("looks in [parrot_interest]'s direction and takes flight")
|
||||||
parrot_state = PARROT_SWOOP | PARROT_STEAL
|
parrot_state = PARROT_SWOOP | PARROT_STEAL
|
||||||
icon_state = "parrot_fly"
|
icon_state = "parrot_fly"
|
||||||
return
|
return
|
||||||
@@ -310,7 +376,7 @@
|
|||||||
if(AM)
|
if(AM)
|
||||||
if(istype(AM, /obj/item) || isliving(AM)) //If stealable item
|
if(istype(AM, /obj/item) || isliving(AM)) //If stealable item
|
||||||
parrot_interest = AM
|
parrot_interest = AM
|
||||||
emote("[src] turns and flies towards [parrot_interest].")
|
emote("turns and flies towards [parrot_interest]")
|
||||||
parrot_state = PARROT_SWOOP | PARROT_STEAL
|
parrot_state = PARROT_SWOOP | PARROT_STEAL
|
||||||
return
|
return
|
||||||
else //Else it's a perch
|
else //Else it's a perch
|
||||||
@@ -454,6 +520,11 @@
|
|||||||
* Procs
|
* Procs
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/mob/living/simple_animal/parrot/movement_delay()
|
||||||
|
if(client && parrot_state != "parrot_fly")
|
||||||
|
icon_state = "parrot_fly"
|
||||||
|
..()
|
||||||
|
|
||||||
/mob/living/simple_animal/parrot/proc/search_for_item()
|
/mob/living/simple_animal/parrot/proc/search_for_item()
|
||||||
for(var/atom/movable/AM in view(src))
|
for(var/atom/movable/AM in view(src))
|
||||||
for(var/path in desired_items)
|
for(var/path in desired_items)
|
||||||
@@ -509,29 +580,36 @@
|
|||||||
return -1
|
return -1
|
||||||
|
|
||||||
if(held_item)
|
if(held_item)
|
||||||
usr << "\red You are already holding the [held_item]"
|
src << "\red You are already holding the [held_item]"
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
for(var/obj/item/I in view(1,src))
|
for(var/obj/item/I in view(1,src))
|
||||||
for(var/path in desired_items)
|
for(var/path in desired_items)
|
||||||
|
//Make sure it's the proper item and we're not holding it
|
||||||
if(istype(I, path) && I.loc != src)
|
if(istype(I, path) && I.loc != src)
|
||||||
|
|
||||||
|
//If we have a perch and the item is sitting on it, continue
|
||||||
|
if(!client && parrot_perch && I.loc == parrot_perch)
|
||||||
|
continue
|
||||||
|
|
||||||
held_item = I
|
held_item = I
|
||||||
I.loc = src
|
I.loc = src
|
||||||
visible_message("[src] grabs the [held_item]!", "\blue You grab the [held_item]!", "You hear the sounds of wings flapping furiously.")
|
visible_message("[src] grabs the [held_item]!", "\blue You grab the [held_item]!", "You hear the sounds of wings flapping furiously.")
|
||||||
return held_item
|
return held_item
|
||||||
|
|
||||||
usr << "\red There is nothing of interest to take."
|
src << "\red There is nothing of interest to take."
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
/mob/living/simple_animal/parrot/proc/steal_from_mob()
|
/mob/living/simple_animal/parrot/proc/steal_from_mob()
|
||||||
set name = "Steal from mob"
|
set name = "Steal from mob"
|
||||||
set category = "Parrot"
|
set category = "Parrot"
|
||||||
set desc = "Steals an item right out of a person's hand!"
|
set desc = "Steals an item right out of a person's hand!"
|
||||||
|
|
||||||
if(stat)
|
if(stat)
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
if(held_item)
|
if(held_item)
|
||||||
usr << "\red You are already holding the [held_item]"
|
src << "\red You are already holding the [held_item]"
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
var/obj/item/stolen_item = null
|
var/obj/item/stolen_item = null
|
||||||
@@ -551,9 +629,17 @@
|
|||||||
visible_message("[src] grabs the [held_item] out of [C]'s hand!", "\blue You snag the [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.")
|
visible_message("[src] grabs the [held_item] out of [C]'s hand!", "\blue You snag the [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.")
|
||||||
return held_item
|
return held_item
|
||||||
|
|
||||||
usr << "\red There is nothing of interest to take."
|
src << "\red There is nothing of interest to take."
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
/mob/living/simple_animal/parrot/verb/drop_held_item_player()
|
||||||
|
set name = "Drop held item"
|
||||||
|
set category = "Parrot"
|
||||||
|
set desc = "Drop the item you're holding."
|
||||||
|
|
||||||
|
src.drop_held_item()
|
||||||
|
return
|
||||||
|
|
||||||
/mob/living/simple_animal/parrot/proc/drop_held_item(var/drop_gently = 1)
|
/mob/living/simple_animal/parrot/proc/drop_held_item(var/drop_gently = 1)
|
||||||
set name = "Drop held item"
|
set name = "Drop held item"
|
||||||
set category = "Parrot"
|
set category = "Parrot"
|
||||||
@@ -569,16 +655,35 @@
|
|||||||
if(!drop_gently)
|
if(!drop_gently)
|
||||||
if(istype(held_item, /obj/item/weapon/grenade))
|
if(istype(held_item, /obj/item/weapon/grenade))
|
||||||
var/obj/item/weapon/grenade/G = held_item
|
var/obj/item/weapon/grenade/G = held_item
|
||||||
G.loc = get_turf(src)
|
G.loc = src.loc
|
||||||
G.prime()
|
G.prime()
|
||||||
|
src << "You let go of the [held_item]!"
|
||||||
held_item = null
|
held_item = null
|
||||||
|
return 1
|
||||||
|
|
||||||
usr << "You drop the [held_item]."
|
src << "You drop the [held_item]."
|
||||||
|
|
||||||
held_item.loc = src.loc
|
held_item.loc = src.loc
|
||||||
held_item = null
|
held_item = null
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
/mob/living/simple_animal/parrot/proc/perch_player()
|
||||||
|
set name = "Sit"
|
||||||
|
set category = "Parrot"
|
||||||
|
set desc = "Sit on a nice comfy perch."
|
||||||
|
|
||||||
|
if(stat || !client)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(icon_state == "parrot_fly")
|
||||||
|
for(var/atom/movable/AM in view(src,1))
|
||||||
|
for(var/perch_path in desired_perches)
|
||||||
|
if(istype(AM, perch_path))
|
||||||
|
src.loc = AM.loc
|
||||||
|
icon_state = "parrot_sit"
|
||||||
|
return
|
||||||
|
return
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sub-types
|
* Sub-types
|
||||||
*/
|
*/
|
||||||
@@ -589,4 +694,5 @@
|
|||||||
|
|
||||||
/mob/living/simple_animal/parrot/Poly/New()
|
/mob/living/simple_animal/parrot/Poly/New()
|
||||||
ears = new /obj/item/device/radio/headset/headset_eng(src)
|
ears = new /obj/item/device/radio/headset/headset_eng(src)
|
||||||
|
available_channels = list(":e")
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -234,9 +234,7 @@
|
|||||||
|
|
||||||
if(moving) return 0
|
if(moving) return 0
|
||||||
|
|
||||||
if(move_delay >= 864000) move_delay -= 864000
|
if(world.time < move_delay) return
|
||||||
|
|
||||||
if(world.timeofday < move_delay) return
|
|
||||||
|
|
||||||
if(!mob) return
|
if(!mob) return
|
||||||
|
|
||||||
@@ -283,7 +281,7 @@
|
|||||||
src << "\blue You're restrained! You can't move!"
|
src << "\blue You're restrained! You can't move!"
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
move_delay = world.timeofday//set move delay
|
move_delay = world.time//set move delay
|
||||||
|
|
||||||
switch(mob.m_intent)
|
switch(mob.m_intent)
|
||||||
if("run")
|
if("run")
|
||||||
@@ -306,7 +304,7 @@
|
|||||||
moving = 1
|
moving = 1
|
||||||
//Something with pulling things
|
//Something with pulling things
|
||||||
if(locate(/obj/item/weapon/grab, mob))
|
if(locate(/obj/item/weapon/grab, mob))
|
||||||
move_delay = max(move_delay, world.timeofday + 7)
|
move_delay = max(move_delay, world.time + 7)
|
||||||
var/list/L = mob.ret_grab()
|
var/list/L = mob.ret_grab()
|
||||||
if(istype(L, /list))
|
if(istype(L, /list))
|
||||||
if(L.len == 2)
|
if(L.len == 2)
|
||||||
@@ -364,12 +362,12 @@
|
|||||||
for(var/obj/item/weapon/grab/G in mob.grabbed_by)
|
for(var/obj/item/weapon/grab/G in mob.grabbed_by)
|
||||||
if((G.state == 1)&&(!grabbing.Find(G.assailant))) del(G)
|
if((G.state == 1)&&(!grabbing.Find(G.assailant))) del(G)
|
||||||
if(G.state == 2)
|
if(G.state == 2)
|
||||||
move_delay = world.timeofday + 10
|
move_delay = world.time + 10
|
||||||
if(!prob(25)) return 1
|
if(!prob(25)) return 1
|
||||||
mob.visible_message("\red [mob] has broken free of [G.assailant]'s grip!")
|
mob.visible_message("\red [mob] has broken free of [G.assailant]'s grip!")
|
||||||
del(G)
|
del(G)
|
||||||
if(G.state == 3)
|
if(G.state == 3)
|
||||||
move_delay = world.timeofday + 10
|
move_delay = world.time + 10
|
||||||
if(!prob(5)) return 1
|
if(!prob(5)) return 1
|
||||||
mob.visible_message("\red [mob] has broken free of [G.assailant]'s headlock!")
|
mob.visible_message("\red [mob] has broken free of [G.assailant]'s headlock!")
|
||||||
del(G)
|
del(G)
|
||||||
|
|||||||
@@ -188,7 +188,7 @@
|
|||||||
|
|
||||||
if(href_list["late_join"])
|
if(href_list["late_join"])
|
||||||
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
|
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
|
||||||
usr << "/red The round is either not ready, or has already finished..."
|
usr << "\red The round is either not ready, or has already finished..."
|
||||||
return
|
return
|
||||||
|
|
||||||
if(preferences.species != "Human")
|
if(preferences.species != "Human")
|
||||||
@@ -302,13 +302,23 @@
|
|||||||
src.poll_player(pollid)
|
src.poll_player(pollid)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
if(href_list["votepollid"] && href_list["voteoptionid"])
|
if(href_list["votepollid"] && href_list["voteoptionid"])
|
||||||
usr << "\red DB usage has been disabled and that option should not have been available."
|
usr << "\red DB usage has been disabled and that option should not have been available."
|
||||||
return
|
return
|
||||||
|
|
||||||
|
=======
|
||||||
|
if(href_list["votepollid"] && href_list["votetype"])
|
||||||
|
>>>>>>> remotes/git-svn
|
||||||
var/pollid = text2num(href_list["votepollid"])
|
var/pollid = text2num(href_list["votepollid"])
|
||||||
var/optionid = text2num(href_list["voteoptionid"])
|
var/votetype = href_list["votetype"]
|
||||||
vote_on_poll(pollid, optionid)
|
switch(votetype)
|
||||||
|
if("OPTION")
|
||||||
|
var/optionid = text2num(href_list["voteoptionid"])
|
||||||
|
vote_on_poll(pollid, optionid)
|
||||||
|
if("TEXT")
|
||||||
|
var/replytext = href_list["replytext"]
|
||||||
|
log_text_poll_reply(pollid, replytext)
|
||||||
|
|
||||||
proc/IsJobAvailable(rank)
|
proc/IsJobAvailable(rank)
|
||||||
var/datum/job/job = job_master.GetJob(rank)
|
var/datum/job/job = job_master.GetJob(rank)
|
||||||
|
|||||||
@@ -111,18 +111,20 @@
|
|||||||
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
|
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
|
||||||
if(dbcon.IsConnected())
|
if(dbcon.IsConnected())
|
||||||
|
|
||||||
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question FROM erro_poll_question WHERE id = [pollid]")
|
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid]")
|
||||||
select_query.Execute()
|
select_query.Execute()
|
||||||
|
|
||||||
var/pollstarttime = ""
|
var/pollstarttime = ""
|
||||||
var/pollendtime = ""
|
var/pollendtime = ""
|
||||||
var/pollquestion = ""
|
var/pollquestion = ""
|
||||||
|
var/polltype = ""
|
||||||
var/found = 0
|
var/found = 0
|
||||||
|
|
||||||
while(select_query.NextRow())
|
while(select_query.NextRow())
|
||||||
pollstarttime = select_query.item[1]
|
pollstarttime = select_query.item[1]
|
||||||
pollendtime = select_query.item[2]
|
pollendtime = select_query.item[2]
|
||||||
pollquestion = select_query.item[3]
|
pollquestion = select_query.item[3]
|
||||||
|
polltype = select_query.item[4]
|
||||||
found = 1
|
found = 1
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -130,57 +132,103 @@
|
|||||||
usr << "\red Poll question details not found."
|
usr << "\red Poll question details not found."
|
||||||
return
|
return
|
||||||
|
|
||||||
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
|
switch(polltype)
|
||||||
voted_query.Execute()
|
//Polls that have enumerated options
|
||||||
|
if("OPTION")
|
||||||
|
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
|
||||||
|
voted_query.Execute()
|
||||||
|
|
||||||
var/voted = 0
|
var/voted = 0
|
||||||
var/votedoptionid = 0
|
var/votedoptionid = 0
|
||||||
while(voted_query.NextRow())
|
while(voted_query.NextRow())
|
||||||
votedoptionid = text2num(voted_query.item[1])
|
votedoptionid = text2num(voted_query.item[1])
|
||||||
voted = 1
|
voted = 1
|
||||||
break
|
break
|
||||||
|
|
||||||
var/list/datum/polloption/options = list()
|
var/list/datum/polloption/options = list()
|
||||||
|
|
||||||
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM erro_poll_option WHERE pollid = [pollid]")
|
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM erro_poll_option WHERE pollid = [pollid]")
|
||||||
options_query.Execute()
|
options_query.Execute()
|
||||||
while(options_query.NextRow())
|
while(options_query.NextRow())
|
||||||
var/datum/polloption/PO = new()
|
var/datum/polloption/PO = new()
|
||||||
PO.optionid = text2num(options_query.item[1])
|
PO.optionid = text2num(options_query.item[1])
|
||||||
PO.optiontext = options_query.item[2]
|
PO.optiontext = options_query.item[2]
|
||||||
options += PO
|
options += PO
|
||||||
|
|
||||||
dbcon.Disconnect()
|
dbcon.Disconnect()
|
||||||
|
|
||||||
var/output = "<div align='center'><B>Player poll</B>"
|
var/output = "<div align='center'><B>Player poll</B>"
|
||||||
output +="<hr>"
|
output +="<hr>"
|
||||||
output += "<b>Question: [pollquestion]</b><br>"
|
output += "<b>Question: [pollquestion]</b><br>"
|
||||||
output += "<font size='2'>Poll runs from <b>[pollstarttime]</b> until <b>[pollendtime]</b></font><p>"
|
output += "<font size='2'>Poll runs from <b>[pollstarttime]</b> until <b>[pollendtime]</b></font><p>"
|
||||||
|
|
||||||
if(!voted) //Only make this a form if we have not voted yet
|
if(!voted) //Only make this a form if we have not voted yet
|
||||||
output += "<form name='cardcomp' action='?src=\ref[src]' method='get'>"
|
output += "<form name='cardcomp' action='?src=\ref[src]' method='get'>"
|
||||||
output += "<input type='hidden' name='src' value='\ref[src]'>"
|
output += "<input type='hidden' name='src' value='\ref[src]'>"
|
||||||
output += "<input type='hidden' name='votepollid' value='[pollid]'>"
|
output += "<input type='hidden' name='votepollid' value='[pollid]'>"
|
||||||
|
output += "<input type='hidden' name='votetype' value='OPTION'>"
|
||||||
|
|
||||||
output += "<table><tr><td>"
|
output += "<table><tr><td>"
|
||||||
for(var/datum/polloption/O in options)
|
for(var/datum/polloption/O in options)
|
||||||
if(O.optionid && O.optiontext)
|
if(O.optionid && O.optiontext)
|
||||||
if(voted)
|
if(voted)
|
||||||
if(votedoptionid == O.optionid)
|
if(votedoptionid == O.optionid)
|
||||||
output += "<b>[O.optiontext]</b><br>"
|
output += "<b>[O.optiontext]</b><br>"
|
||||||
else
|
else
|
||||||
output += "[O.optiontext]<br>"
|
output += "[O.optiontext]<br>"
|
||||||
|
else
|
||||||
|
output += "<input type='radio' name='voteoptionid' value='[O.optionid]'> [O.optiontext]<br>"
|
||||||
|
output += "</td></tr></table>"
|
||||||
|
|
||||||
|
if(!voted) //Only make this a form if we have not voted yet
|
||||||
|
output += "<p><input type='submit' value='Vote'>"
|
||||||
|
output += "</form>"
|
||||||
|
|
||||||
|
output += "</div>"
|
||||||
|
|
||||||
|
src << browse(output,"window=playerpoll;size=500x250")
|
||||||
|
|
||||||
|
//Polls with a text input
|
||||||
|
if("TEXT")
|
||||||
|
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM erro_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
|
||||||
|
voted_query.Execute()
|
||||||
|
|
||||||
|
var/voted = 0
|
||||||
|
var/vote_text = ""
|
||||||
|
while(voted_query.NextRow())
|
||||||
|
vote_text = voted_query.item[1]
|
||||||
|
voted = 1
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
var/output = "<div align='center'><B>Player poll</B>"
|
||||||
|
output +="<hr>"
|
||||||
|
output += "<b>Question: [pollquestion]</b><br>"
|
||||||
|
output += "<font size='2'>Feedback gathering runs from <b>[pollstarttime]</b> until <b>[pollendtime]</b></font><p>"
|
||||||
|
|
||||||
|
if(!voted) //Only make this a form if we have not voted yet
|
||||||
|
output += "<form name='cardcomp' action='?src=\ref[src]' method='get'>"
|
||||||
|
output += "<input type='hidden' name='src' value='\ref[src]'>"
|
||||||
|
output += "<input type='hidden' name='votepollid' value='[pollid]'>"
|
||||||
|
output += "<input type='hidden' name='votetype' value='TEXT'>"
|
||||||
|
|
||||||
|
output += "<font size='2'>Please provide feedback below. You can use any letters of the English alphabet, numbers and the symbols: . , ! ? : ; -</font><br>"
|
||||||
|
output += "<textarea name='replytext' cols='50' rows='14'></textarea>"
|
||||||
|
|
||||||
|
output += "<p><input type='submit' value='Submit'>"
|
||||||
|
output += "</form>"
|
||||||
|
|
||||||
|
output += "<form name='cardcomp' action='?src=\ref[src]' method='get'>"
|
||||||
|
output += "<input type='hidden' name='src' value='\ref[src]'>"
|
||||||
|
output += "<input type='hidden' name='votepollid' value='[pollid]'>"
|
||||||
|
output += "<input type='hidden' name='votetype' value='TEXT'>"
|
||||||
|
output += "<input type='hidden' name='replytext' value='ABSTAIN'>"
|
||||||
|
output += "<input type='submit' value='Abstain'>"
|
||||||
|
output += "</form>"
|
||||||
else
|
else
|
||||||
output += "<input type='radio' name='voteoptionid' value='[O.optionid]'> [O.optiontext]<br>"
|
output += "[vote_text]"
|
||||||
output += "</td></tr></table>"
|
|
||||||
|
|
||||||
if(!voted) //Only make this a form if we have not voted yet
|
src << browse(output,"window=playerpoll;size=500x500")
|
||||||
output += "<p><input type='submit' value='Vote'>"
|
|
||||||
output += "</form>"
|
|
||||||
|
|
||||||
output += "</div>"
|
|
||||||
|
|
||||||
src << browse(output,"window=playerpoll;size=500x250")
|
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/new_player/proc/vote_on_poll(var/pollid = -1, var/optionid = -1)
|
/mob/new_player/proc/vote_on_poll(var/pollid = -1, var/optionid = -1)
|
||||||
@@ -200,12 +248,14 @@
|
|||||||
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
|
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
|
||||||
if(dbcon.IsConnected())
|
if(dbcon.IsConnected())
|
||||||
|
|
||||||
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
|
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
|
||||||
select_query.Execute()
|
select_query.Execute()
|
||||||
|
|
||||||
var/validpoll = 0
|
var/validpoll = 0
|
||||||
|
|
||||||
while(select_query.NextRow())
|
while(select_query.NextRow())
|
||||||
|
if(select_query.item[4] != "OPTION")
|
||||||
|
return
|
||||||
validpoll = 1
|
validpoll = 1
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -248,4 +298,70 @@
|
|||||||
insert_query.Execute()
|
insert_query.Execute()
|
||||||
|
|
||||||
usr << "\blue Vote successful."
|
usr << "\blue Vote successful."
|
||||||
|
usr << browse(null,"window=playerpoll")
|
||||||
|
|
||||||
|
|
||||||
|
/mob/new_player/proc/log_text_poll_reply(var/pollid = -1, var/replytext = "")
|
||||||
|
if(pollid == -1 || replytext == "")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!isnum(pollid) || !istext(replytext))
|
||||||
|
return
|
||||||
|
|
||||||
|
var/user = sqlfdbklogin
|
||||||
|
var/pass = sqlfdbkpass
|
||||||
|
var/db = sqlfdbkdb
|
||||||
|
var/address = sqladdress
|
||||||
|
var/port = sqlport
|
||||||
|
|
||||||
|
var/DBConnection/dbcon = new()
|
||||||
|
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
|
||||||
|
if(dbcon.IsConnected())
|
||||||
|
|
||||||
|
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
|
||||||
|
select_query.Execute()
|
||||||
|
|
||||||
|
var/validpoll = 0
|
||||||
|
|
||||||
|
while(select_query.NextRow())
|
||||||
|
if(select_query.item[4] != "TEXT")
|
||||||
|
return
|
||||||
|
validpoll = 1
|
||||||
|
break
|
||||||
|
|
||||||
|
if(!validpoll)
|
||||||
|
usr << "\red Poll is not valid."
|
||||||
|
return
|
||||||
|
|
||||||
|
var/alreadyvoted = 0
|
||||||
|
|
||||||
|
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
|
||||||
|
voted_query.Execute()
|
||||||
|
|
||||||
|
while(voted_query.NextRow())
|
||||||
|
alreadyvoted = 1
|
||||||
|
break
|
||||||
|
|
||||||
|
if(alreadyvoted)
|
||||||
|
usr << "\red You already sent your feedback for this poll."
|
||||||
|
return
|
||||||
|
|
||||||
|
var/adminrank = "Player"
|
||||||
|
if(usr && usr.client && usr.client.holder)
|
||||||
|
adminrank = usr.client.holder.rank
|
||||||
|
|
||||||
|
|
||||||
|
replytext = dd_replacetext(replytext, "%BR%", "")
|
||||||
|
replytext = dd_replacetext(replytext, "\n", "%BR%")
|
||||||
|
var/text_pass = reject_bad_text(replytext,8000)
|
||||||
|
replytext = dd_replacetext(replytext, "%BR%", "<BR>")
|
||||||
|
|
||||||
|
if(!text_pass)
|
||||||
|
usr << "The text you entered was blank, contained illegal characters or was too long. Please correct the text and submit again."
|
||||||
|
return
|
||||||
|
|
||||||
|
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_textreply (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')")
|
||||||
|
insert_query.Execute()
|
||||||
|
|
||||||
|
usr << "\blue Feedback logging successful."
|
||||||
usr << browse(null,"window=playerpoll")
|
usr << browse(null,"window=playerpoll")
|
||||||
@@ -302,8 +302,8 @@ datum
|
|||||||
holder.remove_reagent("carpotoxin", 1)
|
holder.remove_reagent("carpotoxin", 1)
|
||||||
if(holder.has_reagent("zombiepowder"))
|
if(holder.has_reagent("zombiepowder"))
|
||||||
holder.remove_reagent("zombiepowder", 0.5)
|
holder.remove_reagent("zombiepowder", 0.5)
|
||||||
if(holder.has_reagent("LSD"))
|
if(holder.has_reagent("mindbreaker"))
|
||||||
holder.remove_reagent("LSD", 2)
|
holder.remove_reagent("mindbreaker", 2)
|
||||||
M.hallucination = max(0, M.hallucination - 5)
|
M.hallucination = max(0, M.hallucination - 5)
|
||||||
M.adjustToxLoss(-2)
|
M.adjustToxLoss(-2)
|
||||||
..()
|
..()
|
||||||
@@ -1304,8 +1304,8 @@ datum
|
|||||||
holder.remove_reagent("carpotoxin", 5)
|
holder.remove_reagent("carpotoxin", 5)
|
||||||
if(holder.has_reagent("zombiepowder"))
|
if(holder.has_reagent("zombiepowder"))
|
||||||
holder.remove_reagent("zombiepowder", 5)
|
holder.remove_reagent("zombiepowder", 5)
|
||||||
if(holder.has_reagent("LSD"))
|
if(holder.has_reagent("mindbreaker"))
|
||||||
holder.remove_reagent("LSD", 5)
|
holder.remove_reagent("mindbreaker", 5)
|
||||||
M.hallucination = 0
|
M.hallucination = 0
|
||||||
M.setBrainLoss(0)
|
M.setBrainLoss(0)
|
||||||
M.disabilities = 0
|
M.disabilities = 0
|
||||||
@@ -1345,8 +1345,8 @@ datum
|
|||||||
M.AdjustParalysis(-1)
|
M.AdjustParalysis(-1)
|
||||||
M.AdjustStunned(-1)
|
M.AdjustStunned(-1)
|
||||||
M.AdjustWeakened(-1)
|
M.AdjustWeakened(-1)
|
||||||
if(holder.has_reagent("LSD"))
|
if(holder.has_reagent("mindbreaker"))
|
||||||
holder.remove_reagent("LSD", 5)
|
holder.remove_reagent("mindbreaker", 5)
|
||||||
M.hallucination = max(0, M.hallucination - 10)
|
M.hallucination = max(0, M.hallucination - 10)
|
||||||
if(prob(60)) M.adjustToxLoss(1)
|
if(prob(60)) M.adjustToxLoss(1)
|
||||||
..()
|
..()
|
||||||
@@ -1541,10 +1541,10 @@ datum
|
|||||||
M.status_flags &= ~FAKEDEATH
|
M.status_flags &= ~FAKEDEATH
|
||||||
..()
|
..()
|
||||||
|
|
||||||
LSD
|
mindbreaker
|
||||||
name = "LSD"
|
name = "Mindbreaker Toxin"
|
||||||
id = "LSD"
|
id = "mindbreaker"
|
||||||
description = "A hallucinogen"
|
description = "A powerful hallucinogen. Not a thing to be messed with."
|
||||||
reagent_state = LIQUID
|
reagent_state = LIQUID
|
||||||
color = "#B31008" // rgb: 139, 166, 233
|
color = "#B31008" // rgb: 139, 166, 233
|
||||||
|
|
||||||
|
|||||||
@@ -422,10 +422,10 @@ datum
|
|||||||
required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5)
|
required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5)
|
||||||
result_amount = 2
|
result_amount = 2
|
||||||
|
|
||||||
LSD
|
mindbreaker
|
||||||
name = "LSD"
|
name = "Mindbreaker Toxin"
|
||||||
id = "LSD"
|
id = "mindbreaker"
|
||||||
result = "LSD"
|
result = "mindbreaker"
|
||||||
required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
|
required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
|
||||||
result_amount = 5
|
result_amount = 5
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
if(istype(A, /obj/effect/proc_holder/spell))
|
if(istype(A, /obj/effect/proc_holder/spell))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(istype(A, /obj/structure/reagent_dispensers)) //this block copypasted from reagent_containers/glass, for lack of a better solution
|
if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
|
||||||
if(!A.reagents.total_volume && A.reagents)
|
if(!A.reagents.total_volume && A.reagents)
|
||||||
user << "<span class='notice'>\The [A] is empty.</span>"
|
user << "<span class='notice'>\The [A] is empty.</span>"
|
||||||
return
|
return
|
||||||
@@ -128,7 +128,7 @@
|
|||||||
if(istype(A, /obj/effect/proc_holder/spell))
|
if(istype(A, /obj/effect/proc_holder/spell))
|
||||||
return
|
return
|
||||||
|
|
||||||
if(istype(A, /obj/structure/reagent_dispensers)) //this block copypasted from reagent_containers/glass, for lack of a better solution
|
if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
|
||||||
if(!A.reagents.total_volume && A.reagents)
|
if(!A.reagents.total_volume && A.reagents)
|
||||||
user << "<span class='notice'>\The [A] is empty.</span>"
|
user << "<span class='notice'>\The [A] is empty.</span>"
|
||||||
return
|
return
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 38 KiB |
File diff suppressed because it is too large
Load Diff
10392
maps/tgstation.2.0.9.dmm
10392
maps/tgstation.2.0.9.dmm
File diff suppressed because it is too large
Load Diff
BIN
sound/effects/xylophone1.ogg
Normal file
BIN
sound/effects/xylophone1.ogg
Normal file
Binary file not shown.
BIN
sound/effects/xylophone2.ogg
Normal file
BIN
sound/effects/xylophone2.ogg
Normal file
Binary file not shown.
BIN
sound/effects/xylophone3.ogg
Normal file
BIN
sound/effects/xylophone3.ogg
Normal file
Binary file not shown.
BIN
sound/weapons/ring.ogg
Normal file
BIN
sound/weapons/ring.ogg
Normal file
Binary file not shown.
Reference in New Issue
Block a user