#Reverted default religion to Space Christianity. SS13 is not 40k and the Imperium is not mentioned anywhere in the [tgstation] backstory as far as I know. It's fine if that's what you want to worship but it does not make a lot of sense for it to be the default option.

#A few specific religions will now spawn unique books (they all use the Bible sprite). Feel free to expand on this.
#AIs and cyborgs will now get the code phrases if they are a traitor. Rev heads will no-longer get them. Finally, rev heads will properly equip their items if admin-made.
#Added field generator code improvements by Aygar.
#Added a general turf proc to kill mobs/creatures in a tile, kill_creatures(). Might be useful in the future if more creatures are added.
#Added a general teleport proc, get_teleport_loc(). Supports only 4 directions of movement.
#More code improvements to ninjas. Admins will now only spawn player ghosts as ninjas. No more admin ninjas.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1577 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
noisomehollow@lycos.com
2011-05-13 08:30:05 +00:00
parent b11b745a52
commit e7d8a28fd4
16 changed files with 423 additions and 308 deletions

View File

@@ -276,6 +276,7 @@ datum/mind
var/datum/game_mode/current_mode = ticker.mode
switch (href_list["traitorize"])
if ("headrev")
current_mode.equip_traitor(current,1)
current_mode:equip_revolutionary(current)
//find first headrev
for(var/datum/mind/rev_mind in current_mode:head_revolutionaries)

View File

@@ -18,7 +18,6 @@
return 0
/proc/get_area_name(N) //get area by it's name
for(var/area/A in world)
if(A.name == N)
return A

View File

@@ -381,6 +381,97 @@
return direction_f
//Returns location. Returns null if no location was found.
/proc/get_teleport_loc(var/turf/location as turf,var/mob/target as mob,var/distance = 1, var/density = 0, var/errorx = 0, var/errory = 0, var/eoffsetx = 0, var/eoffsety = 0)
//Location where the teleport begins, target that will teleport, distance to go, density checking 0/1(yes/no).
//Random error in tile placement x, error in tile placement y, and block offset.
//Block offset tells the proc how to place the box. Behind teleport location, relative to starting location, forward, etc.
//Negative values for offset are accepted, think of it in relation to North, -x is west, -y is south. Error defaults to positive.
//Turf and target are seperate in case you want to teleport some distance from a turf the target is not standing on or something.
var/dirx = 0//Generic location finding variable.
var/diry = 0
var/xoffset = 0//Generic counter for offset location.
var/yoffset = 0
var/b1xerror = 0//Generic placing for point A in box. The lower left.
var/b1yerror = 0
var/b2xerror = 0//Generic placing for point B in box. The upper right.
var/b2yerror = 0
errorx = abs(errorx)//Error should never be negative.
errory = abs(errory)
//var/errorxy = round((errorx+errory)/2)//Used for diagonal boxes.
switch(target.dir)//This can be done through equations but switch is the simpler method. And works fast to boot.
//Directs on what values need modifying.
if(1)//North
diry+=distance
yoffset+=eoffsety
xoffset+=eoffsetx
b1xerror-=errorx
b1yerror-=errory
b2xerror+=errorx
b2yerror+=errory
if(2)//South
diry-=distance
yoffset-=eoffsety
xoffset+=eoffsetx
b1xerror-=errorx
b1yerror-=errory
b2xerror+=errorx
b2yerror+=errory
if(4)//East
dirx+=distance
yoffset+=eoffsetx//Flipped.
xoffset+=eoffsety
b1xerror-=errory//Flipped.
b1yerror-=errorx
b2xerror+=errory
b2yerror+=errorx
if(8)//West
dirx-=distance
yoffset-=eoffsetx//Flipped.
xoffset+=eoffsety
b1xerror-=errory//Flipped.
b1yerror-=errorx
b2xerror+=errory
b2yerror+=errorx
var/turf/destination=locate(location.x+dirx,location.y+diry,location.z)
if(destination)//If there is a destination.
if(errorx||errory)//If errorx or y were specified.
var/destination_list[] = list()//To add turfs to list.
//destination_list = new()
/*This will draw a block around the target turf, given what the error is.
Specifying the values above will basically draw a different sort of block.
If the values are the same, it will be a square. If they are different, it will be a rectengle.
In either case, it will center based on offset. Offset is position from center.
Offset always calculates in relation to direction faced. In other words, depending on the direction of the teleport,
the offset should remain positioned in relation to destination.*/
var/turf/center = locate((destination.x+xoffset),(destination.y+yoffset),location.z)//So now, find the new center.
//Now to find a box from center location and make that our destination.
for(var/turf/T in block(locate(center.x+b1xerror,center.y+b1yerror,location.z), locate(center.x+b2xerror,center.y+b2yerror,location.z) ))
if(density&&T.density) continue//If density was specified.
if(T.x>world.maxx || T.x<1) continue//Don't want them to teleport off the map.
if(T.y>world.maxy || T.y<1) continue
destination_list += T
if(destination_list.len)
destination = pick(destination_list)
else return
else//Same deal here.
if(density&&destination.density) return
if(destination.x>world.maxx || destination.x<1) return
if(destination.y>world.maxy || destination.y<1) return
else return
return destination
/proc/angle2text(var/degree)
return dir2text(angle2dir(degree))

View File

@@ -29,6 +29,7 @@ var/syndicate_name = null
return name
//This is referenced in equip_traitor() so it's fairly easy to remove if needed.
//Added this to traitor AIs.
var/syndicate_code_phrase//Code phrase for traitors.
var/syndicate_code_response//Code response for traitors.

View File

@@ -66,60 +66,20 @@ In the case that they are not, I imagine the game will run-time error like crazy
var/C = 100
if(!ninjacost(C,1))
var/obj/item/clothing/suit/space/space_ninja/S = src:wear_suit
var/list/turfs = new/list()
var/turf/picked
var/turf/mobloc = get_turf(loc)
var/safety = 0
var/locx
var/locy
switch(dir)//Gets rectengular range for target.
if(NORTH)
locx = mobloc.x
locy = (mobloc.y+9)
for(var/turf/T in block(locate(locx-3,locy-1,loc.z), locate(locx+3,locy+1,loc.z) ))
if(T.density) continue
if(T.x>world.maxx || T.x<1) continue
if(T.y>world.maxy || T.y<1) continue
turfs += T
if(SOUTH)
locx = mobloc.x
locy = (mobloc.y-9)
for(var/turf/T in block(locate(locx-3,locy-1,loc.z), locate(locx+3,locy+1,loc.z) ))
if(T.density) continue
if(T.x>world.maxx || T.x<1) continue
if(T.y>world.maxy || T.y<1) continue
turfs += T
if(EAST)
locy = mobloc.y
locx = (mobloc.x+9)
for(var/turf/T in block(locate(locx-1,locy-3,loc.z), locate(locx+1,locy+3,loc.z) ))
if(T.density) continue
if(T.x>world.maxx || T.x<1) continue
if(T.y>world.maxy || T.y<1) continue
turfs += T
if(WEST)
locy = mobloc.y
locx = (mobloc.x-9)
for(var/turf/T in block(locate(locx-1,locy-3,loc.z), locate(locx+1,locy+3,loc.z) ))
if(T.density) continue
if(T.x>world.maxx || T.x<1) continue
if(T.y>world.maxy || T.y<1) continue
turfs += T
else safety = 1
if(turfs.len&&!safety)//Cancels the teleportation if no valid turf is found. Usually when teleporting near map edge.
picked = pick(turfs)
var/turf/destination = get_teleport_loc(loc,src,9,1,3,1,0,1)
var/turf/mobloc = get_turf(loc)//To make sure that certain things work properly below.
if(destination&&istype(mobloc, /turf))
spawn(0)
playsound(loc, "sparks", 50, 1)
anim(mobloc,src,'mob.dmi',,"phaseout")
if(istype(get_active_hand(),/obj/item/weapon/grab))//Handles grabbed persons.
var/obj/item/weapon/grab/G = get_active_hand()
G.affecting.loc = locate(picked.x+rand(-1,1),picked.y+rand(-1,1),picked.z)//variation of position.
G.affecting.loc = locate(destination.x+rand(-1,1),destination.y+rand(-1,1),destination.z)//variation of position.
if(istype(get_inactive_hand(),/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = get_inactive_hand()
G.affecting.loc = locate(picked.x+rand(-1,1),picked.y+rand(-1,1),picked.z)//variation of position.
loc = picked
G.affecting.loc = locate(destination.x+rand(-1,1),destination.y+rand(-1,1),destination.z)//variation of position.
loc = destination
spawn(0)
S.spark_system.start()
@@ -127,20 +87,8 @@ In the case that they are not, I imagine the game will run-time error like crazy
playsound(loc, "sparks", 50, 1)
anim(loc,src,'mob.dmi',,"phasein")
spawn(0)//Any living mobs in teleport area are gibbed. Added some more types.
for(var/mob/living/M in picked)
if(M==src) continue
spawn(0)
M.gib()
for(var/obj/mecha/M in picked)
spawn(0)
M.take_damage(100, "brute")
for(var/obj/alien/facehugger/M in picked)//These really need to be mobs.
spawn(0)
M.death()
for(var/obj/livestock/M in picked)
spawn(0)
M.gib()
spawn(0)
destination.kill_creatures(src)//Any living mobs in teleport area are gibbed. Check turf procs for how it does it.
S.coold = 1
S.cell.charge-=(C*10)
else
@@ -157,8 +105,8 @@ In the case that they are not, I imagine the game will run-time error like crazy
var/C = 200
if(!ninjacost(C,1))
var/obj/item/clothing/suit/space/space_ninja/S = src:wear_suit
if(!T.density)
var/turf/mobloc = get_turf(loc)
var/turf/mobloc = get_turf(loc)//To make sure that certain things work properly below.
if(!T.density&&istype(mobloc, /turf))
spawn(0)
playsound(loc, 'sparks4.ogg', 50, 1)
anim(mobloc,src,'mob.dmi',,"phaseout")
@@ -178,23 +126,11 @@ In the case that they are not, I imagine the game will run-time error like crazy
anim(loc,src,'mob.dmi',,"phasein")
spawn(0)//Any living mobs in teleport area are gibbed.
for(var/mob/living/M in T)
if(M==src) continue
spawn(0)
M.gib()
for(var/obj/mecha/M in T)
spawn(0)
M.take_damage(100, "brute")
for(var/obj/alien/facehugger/M in T)//These really need to be mobs.
spawn(0)
M.death()
for(var/obj/livestock/M in T)
spawn(0)
M.gib()
T.kill_creatures(src)
S.coold = 1
S.cell.charge-=(C*10)
else
src << "\red You cannot teleport into solid walls."
src << "\red You cannot teleport into solid walls or from solid matter"
return
//EMP Pulse
@@ -289,7 +225,7 @@ In the case that they are not, I imagine the game will run-time error like crazy
var/C = 200
if(!ninjacost(C))
if(!locate(/obj/effects/energy_net) in M.loc.contents)//Check if they are already being affected by an energy net.
if(!locate(/obj/effects/energy_net) in M.loc)//Check if they are already being affected by an energy net.
if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
for(var/turf/T in getline(loc, M.loc))
if(T==loc||T==M.loc) continue
@@ -347,7 +283,7 @@ In the case that they are not, I imagine the game will run-time error like crazy
set desc = "Combines the VOID-shift and CLOAK-tech devices to freely move between solid matter. Toggle on or off."
set category = "Ninja Ability"
if(!usr.incorporeal_move)
if(!incorporeal_move)
incorporeal_move = 2
density = 0
src << "\blue You will now phase through solid matter."
@@ -366,61 +302,23 @@ Allows to gib up to five squares in a straight line. Seriously.*/
if(!ninjacost())
var/obj/item/clothing/suit/space/space_ninja/S = src:wear_suit
var/locx
var/locy
var/turf/mobloc = get_turf(loc)
var/safety = 0
switch(dir)
if(NORTH)
locx = mobloc.x
locy = (mobloc.y+5)
if(locy>world.maxy)
safety = 1
if(SOUTH)
locx = mobloc.x
locy = (mobloc.y-5)
if(locy<1)
safety = 1
if(EAST)
locy = mobloc.y
locx = (mobloc.x+5)
if(locx>world.maxx)
safety = 1
if(WEST)
locy = mobloc.y
locx = (mobloc.x-5)
if(locx<1)
safety = 1
else safety = 1
if(!safety)//Cancels the teleportation if no valid turf is found. Usually when teleporting near map edge.
var/turf/destination = get_teleport_loc(loc,src,5)
var/turf/mobloc = get_turf(loc)//To make sure that certain things work properly below.
if(destination&&istype(mobloc, /turf))
say("Ai Satsugai!")
var/turf/picked = locate(locx,locy,mobloc.z)
spawn(0)
playsound(loc, "sparks", 50, 1)
anim(mobloc,src,'mob.dmi',,"phaseout")
spawn(0)
for(var/turf/T in getline(mobloc, picked))
for(var/turf/T in getline(mobloc, destination))
spawn(0)
for(var/mob/living/M in T)
if(M==src) continue
spawn(0)
M.gib()
for(var/obj/mecha/M in T)
spawn(0)
M.take_damage(100, "brute")
for(var/obj/alien/facehugger/M in T)//These really need to be mobs.
spawn(0)
M.death()
for(var/obj/livestock/M in T)
spawn(0)
M.gib()
if(T==mobloc||T==picked) continue
T.kill_creatures(src)
if(T==mobloc||T==destination) continue
spawn(0)
anim(T,src,'mob.dmi',,"phasein")
loc = picked
loc = destination
spawn(0)
S.spark_system.start()
@@ -474,8 +372,7 @@ Allows to gib up to five squares in a straight line. Seriously.*/
if(locx>world.maxx)
safety = 1
else safety=1
if(!safety)
if(!safety&&istype(mobloc, /turf))
say("Kumo no Shinkiro!")
var/turf/picked = locate(locx,locy,mobloc.z)
spawn(0)
@@ -504,4 +401,4 @@ Allows to gib up to five squares in a straight line. Seriously.*/
src << "\red The VOID-shift device is malfunctioning, <B>teleportation failed</B>."
else
src << "\red There are no targets in view."
return
return

View File

@@ -35,6 +35,7 @@ ________________________________________________________________________________
/obj/item/clothing/suit/space/space_ninja/proc/killai(var/mob/living/silicon/ai/A as mob)
A << "\red Self-destruct protocol dete-- *bzzzzz*"
A << browse(null, "window=hack spideros")
AI = null
A.death()//Kill
A.ghostize()//Turn into ghost
del(AI)
@@ -73,7 +74,7 @@ ________________________________________________________________________________
U.bruteloss += 1
A = 200
cell.charge-=A
if(U.stat)//If the ninja falls down, they can still try and jaunt away or shift kill their opponent.
if(U.stat)//If the ninja gets paralyzed, they can still try and jaunt away (since they can adrenaline boost and then jaunt).
active=0
if(cell.charge<0)
if(kamikaze)
@@ -91,7 +92,7 @@ ________________________________________________________________________________
set desc = "Initializes the suit for field operation."
set category = "Ninja Equip"
var/mob/living/carbon/human/U = usr
var/mob/living/carbon/human/U = loc
if(U.mind&&U.mind.special_role=="Space Ninja"&&U:wear_suit==src&&!initialize)
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init
U << "\blue Now initializing..."
@@ -110,18 +111,18 @@ ________________________________________________________________________________
U << "\red <B>ERROR</B>: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING..."
return
U << "\blue Securing external locking mechanism...\nNeural-net established."
U.head:canremove=0
U.shoes:canremove=0
U.gloves:canremove=0
U.head.canremove=0
U.shoes.canremove=0
U.gloves.canremove=0
canremove=0
sleep(40)
U << "\blue Extending neural-net interface...\nNow monitoring brain wave pattern..."
sleep(40)
if(U.stat==2||U.health<=0)
U << "\red <B>FATAL ERROR</B>: 344--93#&&21 BRAIN WAV3 PATT$RN <B>RED</B>\nA-A-AB0RTING..."
U.head:canremove=1
U.shoes:canremove=1
U.gloves:canremove=1
U.head.canremove=1
U.shoes.canremove=1
U.gloves.canremove=1
canremove=1
verbs += /obj/item/clothing/suit/space/space_ninja/proc/init
return
@@ -136,22 +137,7 @@ ________________________________________________________________________________
U << "\blue Primary system status: <B>ONLINE</B>.\nBackup system status: <B>ONLINE</B>.\nCurrent energy capacity: <B>[cell.charge]</B>."
sleep(40)
U << "\blue All systems operational. Welcome to <B>SpiderOS</B>, [U.real_name]."
U.verbs += /mob/proc/ninjashift
U.verbs += /mob/proc/ninjajaunt
U.verbs += /mob/proc/ninjasmoke
U.verbs += /mob/proc/ninjaboost
U.verbs += /mob/proc/ninjapulse
U.verbs += /mob/proc/ninjablade
U.verbs += /mob/proc/ninjastar
U.verbs += /mob/proc/ninjanet
U.mind.special_verbs += /mob/proc/ninjashift
U.mind.special_verbs += /mob/proc/ninjajaunt
U.mind.special_verbs += /mob/proc/ninjasmoke
U.mind.special_verbs += /mob/proc/ninjaboost
U.mind.special_verbs += /mob/proc/ninjapulse
U.mind.special_verbs += /mob/proc/ninjablade
U.mind.special_verbs += /mob/proc/ninjastar
U.mind.special_verbs += /mob/proc/ninjanet
U.grant_ninja_verbs()
verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
U.gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/drain_wire
@@ -162,14 +148,14 @@ ________________________________________________________________________________
U.shoes:slowdown--
ntick(U)
else
if(usr.mind&&usr.mind.special_role=="Space Ninja")
usr << "\red You do not understand how this suit functions."
else if(usr:wear_suit!=src)
usr << "\red You must be wearing the suit to use this function."
if(U.mind&&U.mind.special_role!="Space Ninja")
U << "\red You do not understand how this suit functions."
else if(U.wear_suit!=src)
U << "\red You must be wearing the suit to use this function."
else if(initialize)
usr << "\red The suit is already functioning."
U << "\red The suit is already functioning."
else
usr << "\red You cannot use this function at this time."
U << "\red You cannot use this function at this time."
return
/obj/item/clothing/suit/space/space_ninja/proc/deinit()
@@ -177,45 +163,27 @@ ________________________________________________________________________________
set desc = "Begins procedure to remove the suit."
set category = "Ninja Equip"
if(affecting!=loc)
return
var/mob/living/carbon/human/U = affecting
if(!initialize)
usr << "\red The suit is not initialized."
U << "\red The suit is not initialized."
return
if(alert("Are you certain you wish to remove the suit? This will take time and remove all abilities.",,"Yes","No")=="No")
return
var/mob/living/carbon/human/U = affecting
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
U << "\blue Now de-initializing..."
if(kamikaze)
U << "\blue Disengaging mode...\n\black<b>CODE NAME</b>: \red <b>KAMIKAZE</b>"
U.verbs -= /mob/proc/ninjaslayer
U.verbs -= /mob/proc/ninjawalk
U.verbs -= /mob/proc/ninjamirage
U.mind.special_verbs -= /mob/proc/ninjaslayer
U.mind.special_verbs -= /mob/proc/ninjawalk
U.mind.special_verbs -= /mob/proc/ninjamirage
U.remove_kamikaze_verbs()
kamikaze = 0
unlock = 0
U.incorporeal_move = 0
U.density = 1
spideros = 0
sleep(40)
U.verbs -= /mob/proc/ninjashift
U.verbs -= /mob/proc/ninjajaunt
U.verbs -= /mob/proc/ninjasmoke
U.verbs -= /mob/proc/ninjaboost
U.verbs -= /mob/proc/ninjapulse
U.verbs -= /mob/proc/ninjablade
U.verbs -= /mob/proc/ninjastar
U.verbs -= /mob/proc/ninjanet
U.mind.special_verbs -= /mob/proc/ninjashift
U.mind.special_verbs -= /mob/proc/ninjajaunt
U.mind.special_verbs -= /mob/proc/ninjasmoke
U.mind.special_verbs -= /mob/proc/ninjaboost
U.mind.special_verbs -= /mob/proc/ninjapulse
U.mind.special_verbs -= /mob/proc/ninjablade
U.mind.special_verbs -= /mob/proc/ninjastar
U.mind.special_verbs -= /mob/proc/ninjanet
U.remove_ninja_verbs()
U << "\blue Logging off, [U:real_name]. Shutting down <B>SpiderOS</B>."
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
sleep(40)
@@ -233,8 +201,6 @@ ________________________________________________________________________________
U << "\red #2#"
spawn(30)
U << "\red #1#: <B>G00DBYE</B>"
if(AI)
killai(AI)
U.gib()
return
U << "\blue Disconnecting neural-net interface...\green<B>Success</B>\blue."
@@ -244,7 +210,7 @@ ________________________________________________________________________________
if(istype(U.head, /obj/item/clothing/head/helmet/space/space_ninja))
U.head.canremove=1
if(istype(U.shoes, /obj/item/clothing/shoes/space_ninja))
U.shoes:canremove=1
U.shoes.canremove=1
U.shoes:slowdown++
if(istype(U.gloves, /obj/item/clothing/gloves/space_ninja))
U.gloves.icon_state = "s-ninja"
@@ -419,7 +385,7 @@ ________________________________________________________________________________
var/laws
dat += "<h4><img src=sos_13.png> AI Control:</h4>"
var/mob/living/silicon/ai/A = AI
if(AI)//If an AI exists, in case it gets purged.
if(AI)//If an AI exists, in case it gets purged while on this screen.
dat += "Stored AI: <b>[A.name]</b><br>"
dat += "System integrity: [(A.health+100)/2]%<br>"
@@ -591,22 +557,7 @@ ________________________________________________________________________________
U.gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/drain_wire
U.gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
U.update_clothing()
U.verbs -= /mob/proc/ninjashift
U.verbs -= /mob/proc/ninjajaunt
U.verbs -= /mob/proc/ninjapulse
U.verbs -= /mob/proc/ninjastar
U.verbs -= /mob/proc/ninjanet
U.mind.special_verbs -= /mob/proc/ninjashift
U.mind.special_verbs -= /mob/proc/ninjajaunt
U.mind.special_verbs -= /mob/proc/ninjapulse
U.mind.special_verbs -= /mob/proc/ninjastar
U.mind.special_verbs -= /mob/proc/ninjanet
U.verbs += /mob/proc/ninjaslayer
U.verbs += /mob/proc/ninjawalk
U.verbs += /mob/proc/ninjamirage
U.mind.special_verbs += /mob/proc/ninjaslayer
U.mind.special_verbs += /mob/proc/ninjawalk
U.mind.special_verbs += /mob/proc/ninjamirage
U.grant_kamikaze_verbs()
U.ninjablade()
message_admins("\blue [U.key] used KAMIKAZE mode.", 1)
else
@@ -728,17 +679,17 @@ ________________________________________________________________________________
spideros()//Refreshes the screen by calling it again (which replaces current screen with new screen).
else//If they are not in control.
var/mob/living/silicon/ai/AI = usr
var/mob/living/silicon/ai/A = AI
//While AI has control, the person can't take off the suit so checking here would be moot.
if(isnull(src))//If they AI dies/suit destroyed.
AI << browse(null, "window=hack spideros")
A << browse(null, "window=hack spideros")
return
var/obj/proc_holder/ai_hack_ninja/ninja_spideros = locate() in AI//What is the object granting access to proc? Find it.
var/obj/proc_holder/ai_hack_ninja/ninja_spideros = locate() in A//What is the object granting access to proc? Find it.
switch(href_list["choice"])
if("Close")
AI << browse(null, "window=hack spideros")
A << browse(null, "window=hack spideros")
return
if("Refresh")//Refresh, goes to the end of the proc.
if("Return")//Return
@@ -753,7 +704,7 @@ ________________________________________________________________________________
U.electrocute_act(damage, src,0.1,1)//The last argument is a safety for the human proc that checks for gloves.
cell.charge -= damage
else
AI << "\red <b>ERROR</b>: \black Not enough energy remaining."
A << "\red <b>ERROR</b>: \black Not enough energy remaining."
if("0")//Menus are numbers, see note above. 0 is the hub.
spideros=0
if("1")//Begin normal menus 1-9.
@@ -769,13 +720,13 @@ ________________________________________________________________________________
var/t = input(U, "Please enter untraceable message.") as text
t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
if(!t||affecting!=U||!initialize)//Wow, another one of these. Man...
AI << browse(null, "window=hack spideros")
A << browse(null, "window=hack spideros")
return
if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists.
AI << "\red Error: unable to deliver message."
A << "\red Error: unable to deliver message."
ninja_spideros.Click()
return
P.tnote += "<i><b>&larr; From [AI]:</b></i><br>[t]<br>"//Oh ai, u so silly
P.tnote += "<i><b>&larr; From [A]:</b></i><br>[t]<br>"//Oh ai, u so silly
if (!P.silent)
playsound(P.loc, 'twobeep.ogg', 50, 1)
for (var/mob/O in hearers(3, P.loc))
@@ -783,54 +734,54 @@ ________________________________________________________________________________
P.overlays = null
P.overlays += image('pda.dmi', "pda-r")
if("Unlock Kamikaze")
AI << "\red <b>ERROR</b>: \black TARANTULA.v.4.77.12 encryption algorithm detected. Unable to decrypt archive. \n Aborting..."
A << "\red <b>ERROR</b>: \black TARANTULA.v.4.77.12 encryption algorithm detected. Unable to decrypt archive. \n Aborting..."
if("Dylovene")
if(!reagents.get_reagent_amount("anti_toxin"))
AI << "\red Error: the suit cannot perform this function. Out of dylovene."
A << "\red Error: the suit cannot perform this function. Out of dylovene."
else
reagents.reaction(U, 2)
reagents.trans_id_to(U, "anti_toxin", transfera)
AI << "Injecting..."
A << "Injecting..."
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
if("Dexalin Plus")
if(!reagents.get_reagent_amount("dexalinp"))
AI << "\red Error: the suit cannot perform this function. Out of dexalinp."
A << "\red Error: the suit cannot perform this function. Out of dexalinp."
else
reagents.reaction(U, 2)
reagents.trans_id_to(U, "dexalinp", transfera)
AI << "Injecting..."
A << "Injecting..."
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
if("Tricordazine")
if(!reagents.get_reagent_amount("tricordrazine"))
AI << "\red Error: the suit cannot perform this function. Out of tricordrazine."
A << "\red Error: the suit cannot perform this function. Out of tricordrazine."
else
reagents.reaction(U, 2)
reagents.trans_id_to(U, "tricordrazine", transfera)
AI << "Injecting..."
A << "Injecting..."
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
if("Spacelin")
if(!reagents.get_reagent_amount("spaceacillin"))
AI << "\red Error: the suit cannot perform this function. Out of spaceacillin."
A << "\red Error: the suit cannot perform this function. Out of spaceacillin."
else
reagents.reaction(U, 2)
reagents.trans_id_to(U, "spaceacillin", transfera)
AI << "Injecting..."
A << "Injecting..."
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
if("Radium")
if((reagents.get_reagent_amount("radium"))<=60)//Special case. If there are only 60 radium units left.
AI << "\red Error: the suit cannot perform this function. Out of radium."
A << "\red Error: the suit cannot perform this function. Out of radium."
else
reagents.reaction(U, 2)
reagents.trans_id_to(U, "radium", transfera)
AI << "Injecting..."
A << "Injecting..."
U << "You feel a tiny prick and a sudden rush of liquid in to your veins."
if("Nutriment")
if(!reagents.get_reagent_amount("nutriment"))
AI << "\red Error: the suit cannot perform this function. Out of nutriment."
A << "\red Error: the suit cannot perform this function. Out of nutriment."
else
reagents.reaction(U, 2)
reagents.trans_id_to(U, "nutriment", 5)
AI << "Injecting..."
A << "Injecting..."
U << "You feel a tiny prick and a sudden rush of substance in to your veins."
ninja_spideros.Click()//Calls spideros for AI.
return
@@ -839,19 +790,20 @@ ________________________________________________________________________________
set src in view()
..()
if(initialize)
var/mob/living/carbon/human/U = affecting
if(control)
usr << "All systems operational. Current energy capacity: <B>[cell.charge]</B>."
U << "All systems operational. Current energy capacity: <B>[cell.charge]</B>."
if(!kamikaze)
if(active)
usr << "The CLOAK-tech device is <B>active</B>."
U << "The CLOAK-tech device is <B>active</B>."
else
usr << "The CLOAK-tech device is <B>inactive</B>."
U << "The CLOAK-tech device is <B>inactive</B>."
else
usr << "\red KAMIKAZE MODE ENGAGED!"
usr << "There are <B>[sbombs]</B> smoke bombs remaining."
usr << "There are <B>[aboost]</B> adrenaline boosters remaining."
U << "\red KAMIKAZE MODE ENGAGED!"
U << "There are <B>[sbombs]</B> smoke bombs remaining."
U << "There are <B>[aboost]</B> adrenaline boosters remaining."
else
usr << "ERR0R DATAA NoT FOUND 3RROR"
U << "ERR0R DATAA NoT FOUND 3RROR"
//GLOVES===================================
@@ -859,12 +811,14 @@ ________________________________________________________________________________
set name = "Toggle Interaction"
set desc = "Toggles special interaction on or off."
set category = "Ninja Equip"
var/mob/living/carbon/human/U = loc
if(!candrain)
candrain=1
usr << "You enable special interaction."
U << "You enable special interaction."
else
candrain=0
usr << "You disable special interaction."
U << "You disable special interaction."
//DRAINING PROCS START===================================
@@ -874,7 +828,7 @@ ________________________________________________________________________________
set category = "Ninja Equip"
var/obj/cable/attached
var/mob/living/carbon/human/U = usr
var/mob/living/carbon/human/U = loc
if(candrain&&!draining)
var/turf/T = U.loc
if(isturf(T) && T.is_plating())
@@ -891,7 +845,7 @@ ________________________________________________________________________________
/obj/item/clothing/gloves/space_ninja/proc/drain(var/target_type as text, var/target, var/obj/suit, var/obj/gloves)
//Var Initialize
var/mob/living/carbon/human/U = usr
var/mob/living/carbon/human/U = loc
var/obj/item/clothing/suit/space/space_ninja/S = suit
var/obj/item/clothing/gloves/space_ninja/G = gloves
@@ -1114,10 +1068,11 @@ ________________________________________________________________________________
set src in view()
..()
if(!canremove)
var/mob/living/carbon/human/U = loc
if(candrain)
usr << "The energy drain mechanism is: <B>active</B>."
U << "The energy drain mechanism is: <B>active</B>."
else
usr << "The energy drain mechanism is: <B>inactive</B>."
U << "The energy drain mechanism is: <B>inactive</B>."
//MASK===================================
@@ -1129,6 +1084,8 @@ ________________________________________________________________________________
set name = "Toggle Voice"
set desc = "Toggles the voice synthesizer on or off."
set category = "Ninja Equip"
var/mob/U = loc//Can't toggle voice when you're not wearing the mask.
var/vchange = (alert("Would you like to synthesize a new name or turn off the voice synthesizer?",,"New Name","Turn Off"))
if(vchange=="New Name")
var/chance = rand(1,100)
@@ -1152,20 +1109,20 @@ ________________________________________________________________________________
if(91 to 100)//Small chance of an existing crew name.
var/list/names = new()
for(var/mob/living/carbon/human/M in world)
if(M==usr||!M.client||!M.real_name) continue
if(M==U||!M.client||!M.real_name) continue
names.Add(M)
if(!names.len)
voice = "Cuban Pete"//Smallest chance to be the man.
else
var/mob/picked = pick(names)
voice = picked.real_name
usr << "You are now mimicking <B>[voice]</B>."
U << "You are now mimicking <B>[voice]</B>."
else
if(voice!="Unknown")
usr << "You deactivate the voice synthesizer."
U << "You deactivate the voice synthesizer."
voice = "Unknown"
else
usr << "The voice synthesizer is already deactivated."
U << "The voice synthesizer is already deactivated."
return
/obj/item/clothing/mask/gas/voice/space_ninja/proc/switchm()
@@ -1173,24 +1130,27 @@ ________________________________________________________________________________
set desc = "Switches between Night Vision, Meson, or Thermal vision modes."
set category = "Ninja Equip"
//Have to reset these manually since life.dm is retarded like that. Go figure.
//This will only work for humans since only they have the appropriate code for the mask.
var/mob/U = loc
switch(mode)
if(1)
mode=2
usr.see_in_dark = 2
usr << "Switching mode to <B>Thermal Scanner</B>."
U.see_in_dark = 2
U << "Switching mode to <B>Thermal Scanner</B>."
if(2)
mode=3
usr.see_invisible = 0
usr.sight &= ~SEE_MOBS
usr << "Switching mode to <B>Meson Scanner</B>."
U.see_invisible = 0
U.sight &= ~SEE_MOBS
U << "Switching mode to <B>Meson Scanner</B>."
if(3)
mode=1
usr.sight &= ~SEE_TURFS
usr << "Switching mode to <B>Night Vision</B>."
U.sight &= ~SEE_TURFS
U << "Switching mode to <B>Night Vision</B>."
/obj/item/clothing/mask/gas/voice/space_ninja/examine()
set src in view()
..()
var/mode = "Night Vision"
var/voice = "inactive"
switch(mode)
@@ -1204,7 +1164,7 @@ ________________________________________________________________________________
voice = "inactive"
else
voice = "active"
usr << "<B>[mode]</B> is active."
usr << "<B>[mode]</B> is active."//Leaving usr here since it may be on the floor or on a person.
usr << "Voice mimicking algorithm is set to <B>[voice]</B>."
//ENERGY NET===================================
@@ -1229,7 +1189,7 @@ The sprite for the net is kind of ugly but I couldn't come up with a better one.
anchored = 1//Can't drag/grab.
var/health = 25//How much health it has.
var/mob/living/affecting = null//Who it is currently affecting, if anyone.
var/mob/living/master = null//Who shot the net. Will let this person know if net was successful or failed.
var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed.
/obj/effects/energy_net/proc/healthcheck()
if(health <=0)
@@ -1351,6 +1311,7 @@ The sprite for the net is kind of ugly but I couldn't come up with a better one.
anim(M.loc,M,'mob.dmi',,"phaseout")
M.loc = pick(prisonwarp)//Throw mob in prison.
density = 0//Make the net pass-through.
invisibility = 101//Make the net invisible so all the animations can play out.
health = INFINITY//Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.

View File

@@ -9,18 +9,18 @@ ________________________________________________________________________________
/client/proc/space_ninja()
set category = "Fun"
set name = "Spawn Space Ninja"
set desc = "Spawns a space ninja for when you need a teenager with attitude."
if(!src.authenticated || !src.holder)
set desc = "Spawns a space ninja for when you need a teenager with an attitude."
if(!authenticated || !holder)
src << "Only administrators may use this command."
return
if(!ticker.mode)//Apparently, this doesn't actually prevent anything. Huh
if(!ticker.mode)
alert("The game hasn't started yet!")
return
if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No")
return
TRYAGAIN
var/input = input(usr, "Please specify which mission the space ninja shall undertake.", "Specify Mission", "")
var/input = input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", "")
if(!input)
goto TRYAGAIN
@@ -38,12 +38,12 @@ ________________________________________________________________________________
new_ninja.create_ninja()
var/admin_name = src//In case admins want to spawn themselves as ninjas. Badmins
var/admin_name = src
var/mob/dead/observer/G
var/list/candidates = list()
for(G in world)
if(G.client)
if(G.client&&!G.client.holder)
if(((G.client.inactivity/10)/60) <= 5)
candidates.Add(G)
if(candidates.len)
@@ -65,7 +65,7 @@ ________________________________________________________________________________
message_admins("\blue [admin_name] has spawned [new_ninja.key] as a Space Ninja. Hide yo children!", 1)
log_admin("[admin_name] used Spawn Space Ninja.")
mob/proc/create_ninja()
/mob/proc/create_ninja()
var/mob/living/carbon/human/new_ninja = src
var/ninja_title = pick(ninja_titles)
var/ninja_name = pick(ninja_names)
@@ -93,6 +93,82 @@ mob/proc/create_ninja()
new_ninja.equip_if_possible(new /obj/item/weapon/plastique(new_ninja), new_ninja.slot_l_store)
new_ninja.equip_if_possible(new /obj/item/weapon/tank/emergency_oxygen(new_ninja), new_ninja.slot_s_store)
/mob/proc/grant_ninja_verbs()
verbs += /mob/proc/ninjashift
verbs += /mob/proc/ninjajaunt
verbs += /mob/proc/ninjasmoke
verbs += /mob/proc/ninjaboost
verbs += /mob/proc/ninjapulse
verbs += /mob/proc/ninjablade
verbs += /mob/proc/ninjastar
verbs += /mob/proc/ninjanet
mind.special_verbs += /mob/proc/ninjashift
mind.special_verbs += /mob/proc/ninjajaunt
mind.special_verbs += /mob/proc/ninjasmoke
mind.special_verbs += /mob/proc/ninjaboost
mind.special_verbs += /mob/proc/ninjapulse
mind.special_verbs += /mob/proc/ninjablade
mind.special_verbs += /mob/proc/ninjastar
mind.special_verbs += /mob/proc/ninjanet
return
/mob/proc/remove_ninja_verbs()
verbs -= /mob/proc/ninjashift
verbs -= /mob/proc/ninjajaunt
verbs -= /mob/proc/ninjasmoke
verbs -= /mob/proc/ninjaboost
verbs -= /mob/proc/ninjapulse
verbs -= /mob/proc/ninjablade
verbs -= /mob/proc/ninjastar
verbs -= /mob/proc/ninjanet
mind.special_verbs -= /mob/proc/ninjashift
mind.special_verbs -= /mob/proc/ninjajaunt
mind.special_verbs -= /mob/proc/ninjasmoke
mind.special_verbs -= /mob/proc/ninjaboost
mind.special_verbs -= /mob/proc/ninjapulse
mind.special_verbs -= /mob/proc/ninjablade
mind.special_verbs -= /mob/proc/ninjastar
mind.special_verbs -= /mob/proc/ninjanet
return
/mob/proc/grant_kamikaze_verbs()
verbs -= /mob/proc/ninjashift
verbs -= /mob/proc/ninjajaunt
verbs -= /mob/proc/ninjapulse
verbs -= /mob/proc/ninjastar
verbs -= /mob/proc/ninjanet
mind.special_verbs -= /mob/proc/ninjashift
mind.special_verbs -= /mob/proc/ninjajaunt
mind.special_verbs -= /mob/proc/ninjapulse
mind.special_verbs -= /mob/proc/ninjastar
mind.special_verbs -= /mob/proc/ninjanet
verbs += /mob/proc/ninjaslayer
verbs += /mob/proc/ninjawalk
verbs += /mob/proc/ninjamirage
mind.special_verbs += /mob/proc/ninjaslayer
mind.special_verbs += /mob/proc/ninjawalk
mind.special_verbs += /mob/proc/ninjamirage
return
/mob/proc/remove_kamikaze_verbs()
verbs += /mob/proc/ninjashift
verbs += /mob/proc/ninjajaunt
verbs += /mob/proc/ninjapulse
verbs += /mob/proc/ninjastar
verbs += /mob/proc/ninjanet
mind.special_verbs += /mob/proc/ninjashift
mind.special_verbs += /mob/proc/ninjajaunt
mind.special_verbs += /mob/proc/ninjapulse
mind.special_verbs += /mob/proc/ninjastar
mind.special_verbs += /mob/proc/ninjanet
verbs -= /mob/proc/ninjaslayer
verbs -= /mob/proc/ninjawalk
verbs -= /mob/proc/ninjamirage
mind.special_verbs -= /mob/proc/ninjaslayer
mind.special_verbs -= /mob/proc/ninjawalk
mind.special_verbs -= /mob/proc/ninjamirage
return
//AI COUNTER HACKING===================================
//I've tried a lot of stuff but adding verbs to the AI while inside an object, inside another object, did not want to work properly.
@@ -236,6 +312,9 @@ mob/proc/create_ninja()
A << browse(dat,"window=hack spideros;size=400x444;border=1;can_resize=0;can_close=0;can_minimize=0")
//DEBUG===================================
/*

View File

@@ -56,7 +56,9 @@
/datum/game_mode/proc/send_intercept()
/datum/game_mode/proc/equip_traitor(mob/living/carbon/human/traitor_mob)
/*Added a safety check for traitor keywords.
Rev-heads won't get them. Can be expanded otherwise.*/
/datum/game_mode/proc/equip_traitor(mob/living/carbon/human/traitor_mob, var/safety = 0)
if (!istype(traitor_mob))
return
if (traitor_mob.mind)
@@ -132,16 +134,17 @@
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
//Begin code phrase.
traitor_mob << "The Syndicate provided you with the following information on how to identify other agents:"
if(prob(80))
traitor_mob << "\red Code Phrase: \black [syndicate_code_phrase]"
traitor_mob.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")
else
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code phrase."
if(prob(80))
traitor_mob << "\red Code Response: \black [syndicate_code_response]"
traitor_mob.mind.store_memory("<b>Code Response</b>: [syndicate_code_response]")
else
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code response."
traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe."
if(!safety)//If they are not a rev. Can be added on to.
traitor_mob << "The Syndicate provided you with the following information on how to identify other agents:"
if(prob(80))
traitor_mob << "\red Code Phrase: \black [syndicate_code_phrase]"
traitor_mob.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")
else
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code phrase."
if(prob(80))
traitor_mob << "\red Code Response: \black [syndicate_code_response]"
traitor_mob.mind.store_memory("<b>Code Response</b>: [syndicate_code_response]")
else
traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code response."
traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe."
//End code phrase.

View File

@@ -58,7 +58,7 @@
rev_obj.find_target_by_role(head_mind.assigned_role)
rev_mind.objectives += rev_obj
equip_traitor(rev_mind.current) //changing how revs get assigned their uplink so they can get PDA uplinks. --NEO
equip_traitor(rev_mind.current, 1) //changing how revs get assigned their uplink so they can get PDA uplinks. --NEO
equip_revolutionary(rev_mind.current)
update_rev_icons_added(rev_mind)

View File

@@ -190,6 +190,21 @@
killer:set_zeroth_law(law)
killer << "New law: 0. [law]"
//Begin code phrase.
killer << "The Syndicate provided you with the following information on how to identify their agents:"
if(prob(80))
killer << "\red Code Phrase: \black [syndicate_code_phrase]"
killer.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")
else
killer << "Unfortunetly, the Syndicate did not provide you with a code phrase."
if(prob(80))
killer << "\red Code Response: \black [syndicate_code_response]"
killer.mind.store_memory("<b>Code Response</b>: [syndicate_code_response]")
else
killer << "Unfortunetly, the Syndicate did not provide you with a code response."
killer << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe."
//End code phrase.
/datum/game_mode/traitor/proc/get_mob_list()
var/list/mobs = list()
for(var/mob/living/player in world)

View File

@@ -281,26 +281,37 @@
// src.see_invisible = 15 -- Doesn't work as see_invisible is reset every world cycle. -- Skie
//The two procs below allow the Chaplain to choose their religion. All it really does is change their bible.
spawn(0)
var/religion_name = "Imperium"
var/new_religion = input(src, "You are the Chaplain. Would you like to change your religion? Default is the Imperial Cult.", "Name change", religion_name)
var/religion_name = "Christianity"
var/new_religion = input(src, "You are the Chaplain. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)
if ((length(new_religion) == 0) || (new_religion == "Imperium"))
if ((length(new_religion) == 0) || (new_religion == "Christianity"))
new_religion = religion_name
if (new_religion)
if (length(new_religion) >= 26)
new_religion = copytext(new_religion, 1, 26)
new_religion = dd_replacetext(new_religion, ">", "'")
if(new_religion == "Imperium")
B.name = "Uplifting Primer"
else
B.name = "The Holy Book of [new_religion]"
switch(new_religion)
if("Christianity")
B.name = pick("The Holy Bible","The Dead Sea Scrolls")
if("Satanism")
B.name = pick("The Unholy Bible","The Necronomicon")
if("Islam")
B.name = "Quaran"
if("Scientology")
B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
if("Chaos")
B.name = "Space Station 13: The Musical"
if("Imperium")
B.name = "Uplifting Primer"
else
B.name = "The Holy Book of [new_religion]"
spawn(1)
var/deity_name = "Emperor"
var/new_deity = input(src, "Would you like to change your deity? Default is the God Emperor of Mankind.", "Name change", deity_name)
var/deity_name = "Space Jesus"
var/new_deity = input(src, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name)
if ( (length(new_deity) == 0) || (new_deity == "God Emperor of Mankind") )
if ( (length(new_deity) == 0) || (new_deity == "Space Jesus") )
new_deity = deity_name
if(new_deity)

View File

@@ -1204,4 +1204,20 @@ turf/simulated/floor/proc/update_icon()
else
new /turf/simulated/floor/vault(locate(i,j,z),type)
del(src)
del(src)
/turf/proc/kill_creatures(mob/U = null)//Will kill people/creatures and damage mechs./N
//Useful to batch-add creatures to the list.
for(var/mob/living/M in src)
if(M==U) continue//Will not harm U. Since null != M, can be excluded to kill everyone.
spawn(0)
M.gib()
for(var/obj/mecha/M in src)//Mecha are not gibbed but are damaged.
spawn(0)
M.take_damage(100, "brute")
for(var/obj/alien/facehugger/M in src)//These really need to be mobs.
spawn(0)
M.death()
for(var/obj/livestock/M in src)
spawn(0)
M.gib()

View File

@@ -2095,6 +2095,22 @@ var/showadminmessages = 1
M:set_zeroth_law(law)
for(var/mob/living/silicon/O in world)
O << "New law: 0. [law]"
//Begin code phrase.
M << "The Syndicate provided you with the following information on how to identify their agents:"
if(prob(80))
M << "\red Code Phrase: \black [syndicate_code_phrase]"
M.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")
else
M << "Unfortunetly, the Syndicate did not provide you with a code phrase."
if(prob(80))
M << "\red Code Response: \black [syndicate_code_response]"
M.mind.store_memory("<b>Code Response</b>: [syndicate_code_response]")
else
M << "Unfortunetly, the Syndicate did not provide you with a code response."
M << "Use the code words in the order provided, during regular conversation, to identify their agents. Proceed with caution, however, as everyone is a potential foe."
//End code phrase.
if(mode)
log_admin("[key_name(usr)] has made [key_name(M)] a traitor.")
message_admins("\blue [key_name_admin(usr)] has made [key_name_admin(M)] a traitor. Objective is: [objective]", 1)

View File

@@ -1,22 +1,34 @@
/*
field_generator power level display
The icon used for the field_generator need to have 'num_power_levels' number of icon states
named 'Field_Gen +p[num]' where 'num' ranges from 1 to 'num_power_levels'
The power level is displayed using overlays. The current displayed power level is stored in 'powerlevel'.
The overlay in use and the powerlevel variable must be kept in sync. A powerlevel equal to 0 means that
no power level overlay is currently in the overlays list.
-Aygar
*/
#define field_generator_max_power 250
/obj/machinery/field_generator
name = "Field Generator"
desc = "A large thermal battery that projects a high amount of energy when powered."
icon = 'singularity.dmi'
icon = 'field_generator.dmi'
icon_state = "Field_Gen"
anchored = 0
density = 1
req_access = list(access_engine)
use_power = 0
var
const/num_power_levels = 15 // Total number of power level icon has
Varedit_start = 0
Varpower = 0
active = 0
power = 20
power = 20 // Current amount of power
state = 0
warming_up = 0
powerlevel = 0
powerlevel = 0 // Current Power level in overlays list
list/obj/machinery/containment_field/fields
list/obj/machinery/field_generator/connected_gens
clean_up = 0
@@ -24,20 +36,33 @@
update_icon()
if (!active)
icon_state = "Field_Gen"
return
var/level = 3
switch (power)
if(0 to 60)
level = 1
if(61 to 220)
level = 2
if(221 to INFINITY)
level = 3
level = min(level,warming_up)
//Set icon_state has not been set, set to "Field_Gen"
if (icon_state != "Field_Gen")
icon_state = "Field_Gen"
warming_up = 0
else
//If necessary update icon_state to correct value
if (warming_up && icon_state != "Field_Gen +a[warming_up]")
icon_state = "Field_Gen +a[warming_up]"
// Power level indicator
// Scale % power to % num_power_levels and truncate value
var/level = round(num_power_levels * power / field_generator_max_power)
// Clamp between 0 and num_power_levels for out of range power values
level = between(0, level, num_power_levels)
// Do nothing unless new level is diffrent the powerlevel
if (powerlevel!=level)
// If old power overlay exists remove it
if (powerlevel)
// Remove old powerlevel overlay from overlays
overlays -= "Field_Gen +p[powerlevel]"
powerlevel = level
icon_state = "Field_Gen +a[powerlevel]"
// If new power level exists add it to overlays
if (powerlevel)
overlays += "Field_Gen +p[powerlevel]"
New()
@@ -48,17 +73,19 @@
process()
if(src.Varedit_start == 1)
if(src.active == 0)
src.active = 1
src.state = 2
src.power = field_generator_max_power
src.anchored = 1
src.warming_up = 3
if(Varedit_start == 1)
if(active == 0)
active = 1
state = 2
power = field_generator_max_power
anchored = 1
warming_up = 3
turn_on()
Varedit_start = 0
if(src.active == 2)
calc_power()
if(src.active == 2)
calc_power()
else
update_icon()
return
@@ -170,16 +197,15 @@
proc
turn_off()
src.active = 0
active = 0
spawn(1)
src.cleanup()
update_icon()
turn_on()
src.active = 1
active = 1
warming_up = 1
powerlevel = 0
spawn(1)
while (warming_up<3 && active)
sleep(50)