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:
Cael_Aislinn
2012-10-09 22:57:10 +10:00
57 changed files with 10484 additions and 8792 deletions

View File

@@ -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))

View File

@@ -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()

View File

@@ -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)

View File

@@ -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"

View File

@@ -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 .

View File

@@ -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
*/ */

View File

@@ -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.

View File

@@ -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.

View File

@@ -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)

View File

@@ -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"])

View File

@@ -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

View File

@@ -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)

View File

@@ -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")

View File

@@ -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 ---

View File

@@ -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)

View File

@@ -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

View 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

View File

@@ -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()

View File

@@ -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"

View File

@@ -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()

View File

@@ -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

View File

@@ -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)

View File

@@ -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."

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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))

View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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")

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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]"

View File

@@ -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")
..() ..()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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")

View File

@@ -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

View File

@@ -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

View File

@@ -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

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
sound/weapons/ring.ogg Normal file

Binary file not shown.