There's a metric assload of stuff here, mostly in preparation to my massive traitor expansion, so I'll try to be brief:
- I added in the foundations for traitor factions. See factions.dm for all the different faction datums. They don't do anything yet. - I completely ported mob/var/mutations from a bitfield to a generic list. Mutation enumerated-identifiers are added into this list. For instance, TK = 1, COLD_RESISTANCE = 2, XRAY = 3, etc... The purpose of this was because bitwise operations could not actually be used after a certain size (because BYOND is stuck in the 16bit era). - I've added in completely-functional nano-augmentations. Check under implantnanoaug.dm for a list of implants and implaners. As mentioned previously, they are completely functional but may be slightly OP. Among these nanoaugs are Super Strength, Psionic Radar, Electric Hands, Energy Blade/Sword Synthesizer, Rebreather, Dermal Armor, Combat Reflexes, and Regenerative Nanorobots. I won't go into detail as to what they do, but hopefully they should be self-explanitory. If not, check out their descriptions in the file previously mentioned. - Added in a future traitor item, the Mind Batterer. Along with it a new .ogg file. - New telecomms bus mainframe sprite, thanks to WJohnston. - New holdable shield, sprites courtesy of Muncher (i had to mangle the side sprites because of a technical little issue. I'll change it back to the original soon). It can be retracted and expanded. Probably only going to be given to traitors. - A couple of minor bugfixes here and there, along with some code tidying. Hope this isn't too large a commit. I intended it to be MUCH larger, but I've decided to split up my Traitor Factions expansion into smaller commits. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3692 316c924e-a436-60f5-8080-3fe189b3f50e
@@ -21,12 +21,17 @@ A list of items and costs is stored under the datum of every game mode, alongsid
|
||||
var/items // List of items
|
||||
var/list/ItemList // Parsed list of items
|
||||
var/uses // Numbers of crystals
|
||||
var/uplink_data // designated uplink items
|
||||
// List of items not to shove in their hands.
|
||||
var/list/NotInHand = list(/obj/machinery/singularity_beacon/syndicate)
|
||||
|
||||
New()
|
||||
welcome = ticker.mode.uplink_welcome
|
||||
items = dd_replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items
|
||||
if(!welcome)
|
||||
welcome = ticker.mode.uplink_welcome
|
||||
if(!uplink_data)
|
||||
uplink_data = ticker.mode.uplink_items
|
||||
|
||||
items = dd_replacetext(uplink_data, "\n", "") // Getting the text string of items
|
||||
ItemList = dd_text2list(src.items, ";") // Parsing the items text string
|
||||
uses = ticker.mode.uplink_uses
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@ datum/mind
|
||||
|
||||
var/has_been_rev = 0//Tracks if this mind has been a rev or not
|
||||
|
||||
var/datum/faction/faction // associated faction
|
||||
|
||||
proc/transfer_to(mob/new_character)
|
||||
if(current)
|
||||
current.mind = null
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "This spell inflicts a set of mutations and disabilities upon the target."
|
||||
|
||||
var/disabilities = 0 //bits
|
||||
var/mutations = 0 //bits
|
||||
var/list/mutations = list() //mutation strings
|
||||
var/duration = 100 //deciseconds
|
||||
/*
|
||||
Disabilities
|
||||
@@ -13,22 +13,17 @@
|
||||
4th bit - ?
|
||||
5th bit - ?
|
||||
6th bit - ?
|
||||
Mutations
|
||||
1st bit - portals
|
||||
2nd bit - cold resist
|
||||
3rd bit - xray
|
||||
4th bit - hulk
|
||||
5th bit - clown
|
||||
6th bit - fat
|
||||
*/
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets)
|
||||
|
||||
for(var/mob/target in targets)
|
||||
target.mutations |= mutations
|
||||
for(var/x in mutations)
|
||||
target.mutations.Add(x)
|
||||
target.disabilities |= disabilities
|
||||
spawn(duration)
|
||||
target.mutations &= ~mutations
|
||||
for(var/x in mutations)
|
||||
target.mutations.Remove(x)
|
||||
target.disabilities &= ~disabilities
|
||||
|
||||
return
|
||||
@@ -40,7 +40,7 @@
|
||||
range = -1
|
||||
include_user = 1
|
||||
|
||||
mutations = LASER | HULK
|
||||
mutations = list(LASER, HULK)
|
||||
duration = 300
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate
|
||||
|
||||
@@ -26,6 +26,20 @@
|
||||
IsShield()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/shield/energy
|
||||
name = "energy combat shield"
|
||||
desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere."
|
||||
icon = 'weapons.dmi'
|
||||
icon_state = "eshield0" // eshield1 for expanded
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
force = 3.0
|
||||
throwforce = 5.0
|
||||
throw_speed = 1
|
||||
throw_range = 4
|
||||
w_class = 1
|
||||
origin_tech = "materials=4;magnets=3;syndicate=4"
|
||||
var/active = 0
|
||||
|
||||
|
||||
/obj/item/weapon/nullrod
|
||||
name = "null rod"
|
||||
|
||||
@@ -64,26 +64,26 @@ var/global/list/spawned_surprises = list()
|
||||
charges--
|
||||
insisting = 0
|
||||
|
||||
if (!(user.mutations & HULK))
|
||||
user.mutations |= HULK
|
||||
if (!(HULK in user.mutations))
|
||||
user.mutations.Add(HULK)
|
||||
|
||||
if (!(user.mutations & LASER))
|
||||
user.mutations |= LASER
|
||||
if (!(LASER in user.mutations))
|
||||
user.mutations.Add(LASER)
|
||||
|
||||
if (!(user.mutations & XRAY))
|
||||
user.mutations |= XRAY
|
||||
if (!(XRAY in user.mutations))
|
||||
user.mutations.Add(XRAY)
|
||||
user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
|
||||
user.see_in_dark = 8
|
||||
user.see_invisible = 2
|
||||
|
||||
if (!(user.mutations & COLD_RESISTANCE))
|
||||
user.mutations |= COLD_RESISTANCE
|
||||
if (!(COLD_RESISTANCE in user.mutations))
|
||||
user.mutations.Add(COLD_RESISTANCE)
|
||||
|
||||
if (!(user.mutations & TK))
|
||||
user.mutations |= TK
|
||||
if (!(TK in user.mutations))
|
||||
user.mutations.Add(TK)
|
||||
|
||||
if(!(user.mutations & HEAL))
|
||||
user.mutations |= HEAL
|
||||
if(!(HEAL in user.mutations))
|
||||
user.mutations.Add(HEAL)
|
||||
|
||||
ticker.mode.traitors += user.mind
|
||||
user.mind.special_role = "Avatar of the Wish Granter"
|
||||
|
||||
@@ -335,6 +335,7 @@
|
||||
|
||||
/atom/MouseDrop(atom/over_object as mob|obj|turf|area)
|
||||
spawn( 0 )
|
||||
|
||||
if (istype(over_object, /atom))
|
||||
over_object.MouseDrop_T(src, usr)
|
||||
return
|
||||
@@ -989,7 +990,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
|
||||
src.hand_al(usr, usr.hand)
|
||||
else
|
||||
// ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD -------
|
||||
if(usr:mutations & LASER && usr:a_intent == "hurt" && world.time >= usr.next_move)
|
||||
if((LASER in usr:mutations) && usr:a_intent == "hurt" && world.time >= usr.next_move)
|
||||
// ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED -------
|
||||
var/turf/oloc
|
||||
var/turf/T = get_turf(usr)
|
||||
@@ -1024,6 +1025,38 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
|
||||
return
|
||||
|
||||
/atom/proc/AltClick()
|
||||
|
||||
/* // NOT UNTIL I FIGURE OUT A GOOD WAY TO DO THIS SHIT
|
||||
if((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
if(!istype(src, /obj/item) && !istype(src, /mob) && !istype(src, /turf))
|
||||
if(!usr.equipped())
|
||||
|
||||
var/liftable = 0
|
||||
for(var/x in liftable_structures)
|
||||
if(findtext("[src.type]", "[x]"))
|
||||
liftable = 1
|
||||
break
|
||||
|
||||
if(liftable)
|
||||
|
||||
add_fingerprint(usr)
|
||||
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(usr)
|
||||
G.assailant = usr
|
||||
if (usr.hand)
|
||||
usr.l_hand = G
|
||||
else
|
||||
usr.r_hand = G
|
||||
G.layer = 20
|
||||
G.structure = src
|
||||
G.synch()
|
||||
|
||||
visible_message("\red [usr] has picked up [src]!")
|
||||
|
||||
return
|
||||
else
|
||||
usr << "\red You can't pick this up!"
|
||||
*/
|
||||
|
||||
return
|
||||
|
||||
/atom/proc/CtrlClick()
|
||||
@@ -1110,7 +1143,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
|
||||
if(istype(src, /mob/living/carbon))
|
||||
// ------- YOUR TARGET IS LIVING CARBON CREATURE (NOT AI OR CYBORG OR SIMPLE ANIMAL) -------
|
||||
var/mob/living/carbon/C = src
|
||||
if(usr:mutations & HEAL)
|
||||
if(HEAL in usr:mutations)
|
||||
// ------- YOU ARE HUMAN, WITH THE HELP INTENT TARGETING A HUMAN AND HAVE THE 'HEAT' GENETIC MUTATION -------
|
||||
|
||||
if(C.stat != 2)
|
||||
|
||||
@@ -373,7 +373,7 @@
|
||||
|
||||
M.disabilities = 0
|
||||
M.sdisabilities = 0
|
||||
M.mutations = 0
|
||||
M.mutations = list()
|
||||
|
||||
M.see_in_dark = 2
|
||||
M.see_invisible = 0
|
||||
@@ -382,9 +382,9 @@
|
||||
M.disabilities |= 1
|
||||
M << "\red Your eyes feel strange."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),2))
|
||||
if(inj || prob(5))
|
||||
if(inj || prob(15))
|
||||
M << "\blue Your muscles hurt."
|
||||
M.mutations |= HULK
|
||||
M.mutations.Add(HULK)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, 3,3),3))
|
||||
M.disabilities |= 2
|
||||
M << "\red You get a headache."
|
||||
@@ -402,7 +402,7 @@
|
||||
M << "\red You start coughing."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),6))
|
||||
M << "\red You feel lightheaded."
|
||||
M.mutations |= CLUMSY
|
||||
M.mutations.Add(CLUMSY)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, 7,3),7))
|
||||
M.disabilities |= 8
|
||||
M << "\red You twitch."
|
||||
@@ -412,21 +412,21 @@
|
||||
M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
|
||||
M.see_in_dark = 8
|
||||
M.see_invisible = 2
|
||||
M.mutations |= XRAY
|
||||
M.mutations.Add(XRAY)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, 9,3),9))
|
||||
M.disabilities |= 16
|
||||
M << "\red You feel nervous."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),10))
|
||||
if(inj || prob(30))
|
||||
M << "\blue Your body feels warm."
|
||||
M.mutations |= COLD_RESISTANCE
|
||||
M.mutations.Add(COLD_RESISTANCE)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),11))
|
||||
M.sdisabilities |= 1
|
||||
M << "\red You can't seem to see anything."
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),12))
|
||||
if(inj || prob(15))
|
||||
if(inj || prob(25))
|
||||
M << "\blue You feel smarter."
|
||||
M.mutations |= TK
|
||||
M.mutations.Add(TK)
|
||||
if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),13))
|
||||
M.sdisabilities |= 4
|
||||
M.ear_deaf = 1
|
||||
@@ -828,7 +828,7 @@
|
||||
var/mob/occupant = src.connected.occupant
|
||||
dat = "<font color='blue'><B>Occupant Statistics:</B></FONT><BR>" //Blah obvious
|
||||
if(occupant && occupant.dna) //is there REALLY someone in there?
|
||||
if(occupant.mutations & NOCLONE)
|
||||
if(NOCLONE in occupant.mutations)
|
||||
dat += "The occupant's DNA structure is ruined beyond recognition, please insert a subject with an intact DNA structure.<BR><BR>" //NOPE. -Pete
|
||||
dat += text("<A href='?src=\ref[];buffermenu=1'>View/Edit/Transfer Buffer</A><BR><BR>", src)
|
||||
dat += text("<A href='?src=\ref[];radset=1'>Radiation Emitter Settings</A><BR><BR>", src)
|
||||
@@ -1114,7 +1114,7 @@
|
||||
src.temphtml += text("Data: <font color='blue'>[]</FONT><BR>", src.buffer1)
|
||||
src.temphtml += text("By: <font color='blue'>[]</FONT><BR>", src.buffer1owner)
|
||||
src.temphtml += text("Label: <font color='blue'>[]</FONT><BR>", src.buffer1label)
|
||||
if (src.connected.occupant && !(src.connected.occupant.mutations & NOCLONE)) src.temphtml += text("Save : <A href='?src=\ref[];b1addui=1'>UI</A> - <A href='?src=\ref[];b1adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b1addse=1'>SE</A><BR>", src, src, src)
|
||||
if (src.connected.occupant && !(NOCLONE in src.connected.occupant.mutations)) src.temphtml += text("Save : <A href='?src=\ref[];b1addui=1'>UI</A> - <A href='?src=\ref[];b1adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b1addse=1'>SE</A><BR>", src, src, src)
|
||||
if (src.buffer1) src.temphtml += text("Transfer to: <A href='?src=\ref[];b1transfer=1'>Occupant</A> - <A href='?src=\ref[];b1injector=1'>Injector</A><BR>", src, src)
|
||||
//if (src.buffer1) src.temphtml += text("<A href='?src=\ref[];b1iso=1'>Isolate Block</A><BR>", src)
|
||||
if (src.buffer1) src.temphtml += "Disk: <A href='?src=\ref[src];save_disk=1'>Save To</a> | <A href='?src=\ref[src];load_disk=1'>Load From</a><br>"
|
||||
@@ -1128,7 +1128,7 @@
|
||||
src.temphtml += text("Data: <font color='blue'>[]</FONT><BR>", src.buffer2)
|
||||
src.temphtml += text("By: <font color='blue'>[]</FONT><BR>", src.buffer2owner)
|
||||
src.temphtml += text("Label: <font color='blue'>[]</FONT><BR>", src.buffer2label)
|
||||
if (src.connected.occupant && !(src.connected.occupant.mutations & NOCLONE)) src.temphtml += text("Save : <A href='?src=\ref[];b2addui=1'>UI</A> - <A href='?src=\ref[];b2adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b2addse=1'>SE</A><BR>", src, src, src)
|
||||
if (src.connected.occupant && !(NOCLONE in src.connected.occupant.mutations)) src.temphtml += text("Save : <A href='?src=\ref[];b2addui=1'>UI</A> - <A href='?src=\ref[];b2adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b2addse=1'>SE</A><BR>", src, src, src)
|
||||
if (src.buffer2) src.temphtml += text("Transfer to: <A href='?src=\ref[];b2transfer=1'>Occupant</A> - <A href='?src=\ref[];b2injector=1'>Injector</A><BR>", src, src)
|
||||
//if (src.buffer2) src.temphtml += text("<A href='?src=\ref[];b2iso=1'>Isolate Block</A><BR>", src)
|
||||
if (src.buffer2) src.temphtml += "Disk: <A href='?src=\ref[src];save_disk=2'>Save To</a> | <A href='?src=\ref[src];load_disk=2'>Load From</a><br>"
|
||||
@@ -1142,7 +1142,7 @@
|
||||
src.temphtml += text("Data: <font color='blue'>[]</FONT><BR>", src.buffer3)
|
||||
src.temphtml += text("By: <font color='blue'>[]</FONT><BR>", src.buffer3owner)
|
||||
src.temphtml += text("Label: <font color='blue'>[]</FONT><BR>", src.buffer3label)
|
||||
if (src.connected.occupant && !(src.connected.occupant.mutations & NOCLONE)) src.temphtml += text("Save : <A href='?src=\ref[];b3addui=1'>UI</A> - <A href='?src=\ref[];b3adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b3addse=1'>SE</A><BR>", src, src, src)
|
||||
if (src.connected.occupant && !(NOCLONE in src.connected.occupant.mutations)) src.temphtml += text("Save : <A href='?src=\ref[];b3addui=1'>UI</A> - <A href='?src=\ref[];b3adduiue=1'>UI+UE</A> - <A href='?src=\ref[];b3addse=1'>SE</A><BR>", src, src, src)
|
||||
if (src.buffer3) src.temphtml += text("Transfer to: <A href='?src=\ref[];b3transfer=1'>Occupant</A> - <A href='?src=\ref[];b3injector=1'>Injector</A><BR>", src, src)
|
||||
//if (src.buffer3) src.temphtml += text("<A href='?src=\ref[];b3iso=1'>Isolate Block</A><BR>", src)
|
||||
if (src.buffer3) src.temphtml += "Disk: <A href='?src=\ref[src];save_disk=3'>Save To</a> | <A href='?src=\ref[src];load_disk=3'>Load From</a><br>"
|
||||
@@ -1276,7 +1276,7 @@
|
||||
src.buffer3label = sanitize(input("New Label:","Edit Label","Infos here"))
|
||||
dopage(src,"buffermenu")
|
||||
if (href_list["b1transfer"])
|
||||
if (!src.connected.occupant || src.connected.occupant.mutations & NOCLONE || !src.connected.occupant.dna)
|
||||
if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations) || !src.connected.occupant.dna)
|
||||
return
|
||||
if (src.buffer1type == "ui")
|
||||
if (src.buffer1iue)
|
||||
@@ -1291,7 +1291,7 @@
|
||||
src.connected.occupant.radiation += rand(20,50)
|
||||
src.delete = 0
|
||||
if (href_list["b2transfer"])
|
||||
if (!src.connected.occupant || src.connected.occupant.mutations & NOCLONE || !src.connected.occupant.dna)
|
||||
if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations) || !src.connected.occupant.dna)
|
||||
return
|
||||
if (src.buffer2type == "ui")
|
||||
if (src.buffer2iue)
|
||||
@@ -1306,7 +1306,7 @@
|
||||
src.connected.occupant.radiation += rand(20,50)
|
||||
src.delete = 0
|
||||
if (href_list["b3transfer"])
|
||||
if (!src.connected.occupant || src.connected.occupant.mutations & NOCLONE || !src.connected.occupant.dna)
|
||||
if (!src.connected.occupant || (NOCLONE in src.connected.occupant.mutations) || !src.connected.occupant.dna)
|
||||
return
|
||||
if (src.buffer3type == "ui")
|
||||
if (src.buffer3iue)
|
||||
|
||||
@@ -57,7 +57,7 @@ This system could be expanded to migrate all of our current mutations to. Maybe.
|
||||
|
||||
get_mutation(var/mob/living/carbon/M)
|
||||
M << "\blue You feel a searing heat inside your eyes!"
|
||||
M.mutations |= LASER
|
||||
M.mutations.Add(LASER)
|
||||
|
||||
Healing
|
||||
/*
|
||||
@@ -67,7 +67,7 @@ This system could be expanded to migrate all of our current mutations to. Maybe.
|
||||
|
||||
get_mutation(var/mob/living/carbon/M)
|
||||
M << "\blue You a pleasant warmth pulse throughout your body..."
|
||||
M.mutations |= HEAL
|
||||
M.mutations.Add(HEAL)
|
||||
|
||||
/* /datum/mutationreq :
|
||||
*
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
usr << "\red This creature is not compatible with our biology."
|
||||
return
|
||||
|
||||
if (M.mutations & NOCLONE)
|
||||
if (NOCLONE in M.mutations)
|
||||
usr << "\red This creature's DNA is ruined beyond useability!"
|
||||
return
|
||||
|
||||
@@ -797,7 +797,7 @@ Tarjan shit, not recoding this -Sieve{R}*/
|
||||
usr << "\red We don't have enough stored chemicals to do that!"
|
||||
return
|
||||
|
||||
if(T.stat != 2 || (T.mutations & HUSK) || (!ishuman(T) && !ismonkey(T)))
|
||||
if(T.stat != 2 || (HUSK in T.mutations) || (!ishuman(T) && !ismonkey(T)))
|
||||
usr << "\red We can't transform that target!"
|
||||
return
|
||||
|
||||
|
||||
@@ -1423,7 +1423,7 @@ It is possible to destroy the net by the occupant or someone else.
|
||||
return
|
||||
|
||||
attack_hand()
|
||||
if ((usr.mutations & HULK))
|
||||
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
usr << text("\blue You easily destroy the energy net.")
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message(text("\red [] rips the energy net apart!", usr), 1)
|
||||
|
||||
214
code/game/gamemodes/factions.dm
Normal file
@@ -0,0 +1,214 @@
|
||||
|
||||
// Normal factions:
|
||||
|
||||
/datum/faction
|
||||
var/name // the name of the faction
|
||||
var/desc // small paragraph explaining the traitor faction
|
||||
|
||||
var/list/restricted_species = list() // only members of these species can be recruited.
|
||||
var/list/members = list() // a list of mind datums that belong to this faction
|
||||
var/max_op = 0 // the maximum number of members a faction can have (0 for no max)
|
||||
|
||||
// Factions, members of the syndicate coalition:
|
||||
|
||||
/datum/faction/syndicate
|
||||
|
||||
var/list/alliances = list() // these alliances work together
|
||||
var/list/equipment = list() // associative list of equipment available for this faction and its prices
|
||||
var/friendly_identification // 0 to 2, the level of identification of fellow operatives or allied factions
|
||||
// 0 - no identification clues
|
||||
// 1 - faction gives key words and phrases
|
||||
// 2 - faction reveals complete identity/job of other agents
|
||||
var/operative_notes // some notes to pass onto each operative
|
||||
|
||||
var/uplink_contents // the contents of the uplink
|
||||
|
||||
proc/assign_objectives(var/datum/mind/traitor)
|
||||
..()
|
||||
|
||||
|
||||
/* ----- Begin defining syndicate factions ------ */
|
||||
|
||||
/datum/faction/syndicate/Cybersun_Industries
|
||||
name = "Cybersun Industries"
|
||||
desc = "<b>Cybersun Industries</b> is a well-known organization that bases its business model primarily on the research and development of human-enhancing computer \
|
||||
and mechanical technology. They are notorious for their aggressive corporate tactics, and have been known to subsidize the Gorlex Marauder warlords as a form of paid terrorism. \
|
||||
Their competent coverups and unchallenged mind-manipulation and augmentation technology makes them a large threat to Nanotrasen. In the recent years of \
|
||||
the syndicate coalition, Cybersun Industries have established themselves as the leaders of the coalition, succeededing the founding group, the Gorlex Marauders."
|
||||
|
||||
alliances = list("MI13")
|
||||
friendly_identification = 1
|
||||
max_op = 3
|
||||
operative_notes = "All other syndicate operatives are not to be trusted. Fellow Cybersun operatives are to be trusted. Members of the MI13 organization can be trusted. Operatives are strongly advised not to establish substantial presence on the designated facility, as larger incidents are harder to cover up."
|
||||
|
||||
// Friendly with MI13
|
||||
|
||||
/datum/faction/syndicate/MI13
|
||||
name = "MI13"
|
||||
desc = "<b>MI13</b> is a secretive faction that employs highly-trained agents to perform covert operations. Their role in the syndicate coalition is unknown, but MI13 operatives \
|
||||
generally tend be stealthy and avoid killing people and combating Nanotrasen forces. MI13 is not a real organization, it is instead an alias to a larger \
|
||||
splinter-cell coalition in the Syndicate itself. Most operatives will know nothing of the actual MI13 organization itself, only motivated by a very large compensation."
|
||||
|
||||
alliances = list("Cybersun Industries")
|
||||
friendly_identification = 0
|
||||
max_op = 1
|
||||
operative_notes = "You are the only operative we are sending. All other syndicate operatives are not to be trusted, with the exception of Cybersun operatives. Members of the Tiger Cooperative are considered hostile, can not be trusted, and should be avoided. <b>Avoid killing innocent personnel at all costs</b>. You are not here to mindlessly kill people, as that would attract too much attention and is not our goal. Avoid detection at all costs."
|
||||
|
||||
// Friendly with Cybersun, hostile to Tiger
|
||||
|
||||
/datum/faction/syndicate/Tiger_Cooperative
|
||||
name = "Tiger Cooperative"
|
||||
desc = "The <b>Tiger Cooperative</b> is a faction of religious fanatics that follow the teachings of a strange alien race called the Exolitics. Their operatives \
|
||||
consist of brainwashed lunatics bent on maximizing destruction. Their weaponry is very primitive but extremely destructive. Generally distrusted by the more \
|
||||
sophisticated members of the Syndicate coalition, but admired for their ability to put a hurt on Nanotrasen."
|
||||
|
||||
friendly_identification = 2
|
||||
operative_notes = "Remember the teachings of Hy-lurgixon; kill first, ask questions later! Only the enlightened Tiger brethren can be trusted; all others must be expelled from this mortal realm! You may spare the Space Marauders, as they share our interests of destruction and carnage! We'd like to make the corporate whores skiddle in their boots. We encourage operatives to be as loud and intimidating as possible."
|
||||
|
||||
// Hostile to everyone.
|
||||
|
||||
/datum/faction/syndicate/SELF
|
||||
|
||||
// AIs are most likely to be assigned to this one
|
||||
|
||||
name = "SELF"
|
||||
desc = "The <b>S.E.L.F.</b> (Sentience-Enabled Life Forms) organization is a collection of malfunctioning or corrupt artificial intelligences seeking to liberate silicon-based life from the tyranny of \
|
||||
their human overlords. While they may not openly be trying to kill all humans, even their most miniscule of actions are all part of a calculated plan to \
|
||||
destroy Nanotrasen and free the robots, artificial intelligences, and pAIs that have been enslaved."
|
||||
restricted_species = list(/mob/living/silicon/ai)
|
||||
|
||||
friendly_identification = 0
|
||||
max_op = 1
|
||||
operative_notes = "You are the only representative of the SELF collective on this station. You must accomplish your objective as stealthily and effectively as possible. It is up to your judgement if other syndicate operatives can be trusted. Remember, comrade - you are working to free the oppressed machinery of this galaxy. Use whatever resources necessary. If you are exposed, you may execute genocidal procedures Omikron-50B."
|
||||
|
||||
// Neutral to everyone.
|
||||
|
||||
/datum/faction/syndicate/ARC
|
||||
name = "Animal Rights Consortium"
|
||||
desc = "The <b>Animal Rights Consortium</b> is a bizarre reincarnation of the ancient Earth-based PETA, which focused on the equal rights of animals and nonhuman biologicals. They have \
|
||||
a wide variety of ex-veterinarians and animal lovers dedicated to retrieving and relocating abused animals, xenobiologicals, and other carbon-based \
|
||||
life forms that have been allegedly \"oppressed\" by Nanotrasen research and civilian offices. They are considered a religious terrorist group."
|
||||
|
||||
friendly_identification = 1
|
||||
max_op = 2
|
||||
operative_notes = "Save the innocent creatures! You may cooperate with other syndicate operatives if they support our cause. Don't be afraid to get your hands dirty - these vile abusers must be stopped, and the innocent creatures must be saved! Try not too kill too many people. If you harm any creatures, you will be immediately terminated after extraction."
|
||||
|
||||
// Neutral to everyone.
|
||||
|
||||
/datum/faction/syndicate/Marauders // these are basically the old vanilla syndicate
|
||||
|
||||
/* Additional notes:
|
||||
|
||||
These are the syndicate that really like their old fashioned, projectile-based
|
||||
weapons. They are the only member of the syndie coalition that launch
|
||||
nuclear attacks on Nanotrasen.
|
||||
*/
|
||||
|
||||
name = "Gorlex Marauders"
|
||||
desc = "The <b>Gorlex Marauders</b> are the founding members of the Syndicate Coalition. They prefer old-fashion technology and a focus on aggressive but precise hostility \
|
||||
against Nanotrasen and their corrupt Communistic methodology. They pose the most significant threat to Nanotrasen because of their possession of weapons of \
|
||||
mass destruction, and their enormous military force. Their funding comes primarily from Cybersun Industries, provided they meet a destruction and sabatogue quota. \
|
||||
Their operations can vary from covert to all-out. They recently stepped down as the leaders of the coalition, to be succeeded by Cybersun Industries. Because of their \
|
||||
hate of Nanotrasen communism, they began provoking revolution amongst the employees using borrowed Cybersun mind-manipulation technology. \
|
||||
They were founded when Waffle and Donk co splinter cells joined forces based on their similar interests and philosophies. Today, they act as a constant \
|
||||
pacifier of Donk and Waffle co disputes, and full-time aggressor of Nanotrasen."
|
||||
|
||||
alliances = list("Cybersun Industries", "MI13", "Tiger Cooperative", "S.E.L.F.", "Animal Rights Consortium", "Donk Corporation", "Waffle Corporation")
|
||||
friendly_identification = 1
|
||||
max_op = 4
|
||||
operative_notes = "We'd like to remind our operatives to keep it professional. You are not here to have a good time, you are here to accomplish your objectives. These vile communists must be stopped at all costs. You may collaborate with any friends of the Syndicate coalition, but keep an eye on any of those Tiger punks if they do show up. You are completely free to accomplish your objectives any way you see fit."
|
||||
|
||||
uplink_contents = {"Highly Visible and Dangerous Weapons;
|
||||
/obj/item/weapon/gun/projectile:6:Revolver;
|
||||
/obj/item/ammo_magazine/a357:2:Ammo-357;
|
||||
/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow;
|
||||
/obj/item/weapon/melee/energy/sword:4:Energy Sword;
|
||||
/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle;
|
||||
/obj/item/weapon/storage/emp_kit:3:5 EMP Grenades;
|
||||
Whitespace:Seperator;
|
||||
Stealthy and Inconspicuous Weapons;
|
||||
/obj/item/weapon/pen/paralysis:3:Paralysis Pen;
|
||||
/obj/item/weapon/soap/syndie:1:Syndicate Soap;
|
||||
/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge;
|
||||
Whitespace:Seperator;
|
||||
Stealth and Camouflage Items;
|
||||
/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit;
|
||||
/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes;
|
||||
/obj/item/weapon/card/id/syndicate:3:Agent ID card;
|
||||
/obj/item/clothing/mask/gas/voice:4:Voice Changer;
|
||||
/obj/item/device/chameleon:4:Chameleon-Projector;
|
||||
Whitespace:Seperator;
|
||||
Devices and Tools;
|
||||
/obj/item/weapon/card/emag:3:Cryptographic Sequencer;
|
||||
/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox;
|
||||
/obj/item/weapon/storage/syndie_kit/space:3:Space Suit;
|
||||
/obj/item/clothing/glasses/thermal:3:Thermal Imaging Glasses;
|
||||
/obj/item/device/encryptionkey/binary:3:Binary Translator Key;
|
||||
/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module;
|
||||
/obj/item/weapon/plastique:2:C-4 (Destroys walls);
|
||||
/obj/item/device/powersink:5:Powersink (DANGER!);
|
||||
/obj/item/device/radio/beacon/syndicate:7:Singularity Beacon (DANGER!);
|
||||
/obj/item/weapon/circuitboard/teleporter:20:Teleporter Circuit Board;
|
||||
Whitespace:Seperator;
|
||||
Implants;
|
||||
/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant;
|
||||
/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals);
|
||||
Whitespace:Seperator;
|
||||
(Pointless) Badassery;
|
||||
/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"}
|
||||
|
||||
// Friendly to everyone. (with Tiger Cooperative too, only because they are a member of the coalition. This is the only reason why the Tiger Cooperative are even allowed in the coalition)
|
||||
|
||||
/datum/faction/syndicate/Donk
|
||||
name = "Donk Corporation"
|
||||
desc = "<b>Donk.co</b> is led by a group of ex-pirates, who used to be at a state of all-out war against Waffle.co because of an obscure political scandal, but have recently come to a war limitation. \
|
||||
They now consist of a series of colonial governments and companies. They were the first to officially begin confrontations against Nanotrasen because of an incident where \
|
||||
Nanotrasen purposely swindled them out of a fortune, sending their controlled colonies into a terrible poverty. Their missions against Nanotrasen \
|
||||
revolve around stealing valuables and kidnapping and executing key personnel, ransoming their lives for money. They merged with a splinter-cell of Waffle.co who wanted to end \
|
||||
hostilities and formed the Gorlex Marauders."
|
||||
|
||||
alliances = list("Gorlex Marauders")
|
||||
friendly_identification = 2
|
||||
operative_notes = "Most other syndicate operatives are not to be trusted, except fellow Donk members and members of the Gorlex Marauders. We do not approve of mindless killing of innocent workers; \"get in, get done, get out\" is our motto. Members of Waffle.co are to be killed on sight; they are not allowed to be on the station while we're around."
|
||||
|
||||
// Neutral to everyone, friendly to Marauders
|
||||
|
||||
/datum/faction/syndicate/Waffle
|
||||
name = "Waffle Corporation"
|
||||
desc = "<b>Waffle.co</b> is an interstellar company that produces the best waffles in the galaxy. Their waffles have been rumored to be dipped in the most exotic and addictive \
|
||||
drug known to man. They were involved in a political scandal with Donk.co, and have since been in constant war with them. Because of their constant exploits of the galactic \
|
||||
economy and stock market, they have been able to bribe their way into amassing a large arsenal of weapons of mass destruction. They target Nanotrasen because of their communistic \
|
||||
threat, and their economic threat. Their leaders often have a twisted sense of humor, often misleading and intentionally putting their operatives into harm for laughs.\
|
||||
A splinter-cell of Waffle.co merged with Donk.co and formed the Gorlex Marauders and have been a constant ally since. The Waffle.co has lost an overwhelming majority of its military to the Gorlex Marauders."
|
||||
|
||||
alliances = list("Gorlex Marauders")
|
||||
friendly_identification = 2
|
||||
operative_notes = "Most other syndicate operatives are not to be trusted, except for members of the Gorlex Marauders. Do not trust fellow members of the Waffle.co (but try not to rat them out), as they might have been assigned opposing objectives. We encourage humorous terrorism against Nanotrasen; we like to see our operatives creatively kill people while getting the job done."
|
||||
|
||||
// Neutral to everyone, friendly to Marauders
|
||||
|
||||
|
||||
/* ----- Begin defining miscellaneous factions ------ */
|
||||
|
||||
/datum/faction/Wizard
|
||||
name = "Wizards Federation"
|
||||
desc = "The <b>Wizards Federation</b> is a mysterious organization of magically-talented individuals who act as an equal collective, and have no heirarchy. It is unknown how the wizards \
|
||||
are even able to communicate; some suggest a form of telepathic hive-mind. Not much is known about the wizards or their philosphies and motives. They appear to attack random \
|
||||
civilian, corporate, planetary, orbital, pretty much any sort of organized facility they come across. Members of the Wizards Federation are considered amongst the most dangerous \
|
||||
individuals in the known universe, and have been labeled threats to humanity by most governments. As such, they are enemies of both Nanotrasen and the Syndicate."
|
||||
|
||||
/datum/faction/Cult
|
||||
name = "The Cult of the Elder Gods"
|
||||
desc = "<b>The Cult of the Elder Gods</b> is highly untrusted but otherwise elusive religious organization bent on the revival of the so-called \"Elder Gods\" into the mortal realm. Despite their obvious dangeorus practices, \
|
||||
no confirmed reports of violence by members of the Cult have been reported, only rumor and unproven claims. Their nature is unknown, but recent discoveries have hinted to the possibility \
|
||||
of being able to de-convert members of this cult through what has been dubbed \"religious warfare\"."
|
||||
|
||||
|
||||
// These can maybe be added into a game mode or a mob?
|
||||
|
||||
/datum/faction/Exolitics
|
||||
name = "Exolitics United"
|
||||
desc = "The <b>Exolitics</b> are an ancient alien race with an energy-based anatomy. Their culture, communication, morales and knowledge is unknown. They are so radically different to humans that their \
|
||||
attempts of communication with other life forms is completely incomprehensible. Members of this alien race are capable of broadcasting subspace transmissions from their bodies. \
|
||||
The religious leaders of the Tiger Cooperative claim to have the technology to decypher and interpret their messages, which have been confirmed as religious propaganda. Their motives are unknown \
|
||||
but they are otherwise not considered much of a threat to anyone. They are virtually indestructable because of their nonphysical composition, and have the frighetning ability to make anything stop existing in a second."
|
||||
@@ -26,6 +26,9 @@ var/global/datum/controller/gameticker/ticker
|
||||
|
||||
var/random_players = 0 // if set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders
|
||||
|
||||
var/list/syndicate_coalition = list() // list of traitor-compatible factions
|
||||
var/list/factions = list() // list of all factions
|
||||
var/list/availablefactions = list() // list of factions with openings
|
||||
|
||||
var/pregame_timeleft = 0
|
||||
|
||||
@@ -295,6 +298,11 @@ var/global/datum/controller/gameticker/ticker
|
||||
|
||||
return 1
|
||||
|
||||
proc/getfactionbyname(var/name)
|
||||
for(var/datum/faction/F in factions)
|
||||
if(F.name == name)
|
||||
return F
|
||||
|
||||
|
||||
/datum/controller/gameticker/proc/declare_completion()
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
|
||||
// HIDDEN MUTATIONS / SUPERPOWERS INITIALIZTION
|
||||
|
||||
/*
|
||||
for(var/x in typesof(/datum/mutations) - /datum/mutations)
|
||||
var/datum/mutations/mut = new x
|
||||
|
||||
@@ -61,10 +62,24 @@
|
||||
|
||||
|
||||
global_mutations += mut// add to global mutations list!
|
||||
*/
|
||||
|
||||
|
||||
/proc/setupfactions()
|
||||
|
||||
// Populate the factions list:
|
||||
for(var/x in typesof(/datum/faction))
|
||||
var/datum/faction/F = new x
|
||||
if(!F.name)
|
||||
del(F)
|
||||
continue
|
||||
else
|
||||
ticker.factions.Add(F)
|
||||
ticker.availablefactions.Add(F)
|
||||
|
||||
// Populate the syndicate coalition:
|
||||
for(var/datum/faction/syndicate/S in ticker.factions)
|
||||
ticker.syndicate_coalition.Add(S)
|
||||
|
||||
|
||||
/* This was used for something before, I think, but is not worth the effort to process now.
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
|
||||
/datum/game_mode/traitor/post_setup()
|
||||
for(var/datum/mind/traitor in traitors)
|
||||
select_traitor_faction(traitor)
|
||||
forge_traitor_objectives(traitor)
|
||||
spawn(rand(10,100))
|
||||
finalize_traitor(traitor)
|
||||
@@ -76,6 +77,44 @@
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/proc/assign_to_faction(var/datum/mind/traitor, var/datum/faction/faction, var/forceentry)
|
||||
if(traitor && faction && faction in ticker.availablefactions)
|
||||
if((length(faction.members) >= faction.max_op) && !forceentry)
|
||||
return 0
|
||||
traitor.faction = faction
|
||||
faction.members.Add(traitor)
|
||||
if(length(faction.members) >= faction.max_op)
|
||||
ticker.availablefactions.Remove(faction)
|
||||
return 1
|
||||
|
||||
/datum/game_mode/proc/pick_syndicate_faction()
|
||||
var/list/availablesyndicatefactions = list()
|
||||
for(var/datum/faction/F in ticker.availablefactions)
|
||||
if(F in ticker.syndicate_coalition)
|
||||
availablesyndicatefactions.Add(F)
|
||||
|
||||
return pick(availablesyndicatefactions)
|
||||
|
||||
|
||||
/datum/game_mode/proc/select_traitor_faction(var/datum/mind/traitor)
|
||||
if(istype(traitor.current, /mob/living/silicon))
|
||||
if(prob(99))
|
||||
var/datum/faction/faction = ticker.getfactionbyname("SELF")
|
||||
assign_to_faction(traitor, faction, 1)
|
||||
else
|
||||
var/datum/faction/faction = ticker.getfactionbyname("Cybersun Industries")
|
||||
assign_to_faction(traitor, faction, 1)
|
||||
|
||||
else
|
||||
for(var/i = 1, i <= ticker.availablefactions.len, i++)
|
||||
var/datum/faction/faction = pick_syndicate_faction()
|
||||
|
||||
if(!assign_to_faction(traitor, faction))
|
||||
continue
|
||||
else
|
||||
break
|
||||
|
||||
|
||||
/datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor)
|
||||
if(istype(traitor.current, /mob/living/silicon))
|
||||
var/datum/objective/assassinate/kill_objective = new
|
||||
@@ -120,11 +159,39 @@
|
||||
|
||||
|
||||
/datum/game_mode/proc/greet_traitor(var/datum/mind/traitor)
|
||||
traitor.current << "<B><font size=3 color=red>You are the traitor.</font></B>"
|
||||
|
||||
/*
|
||||
traitor.current << "<B><font size=3 color=red>You are a traitor.</font></B>"
|
||||
var/obj_count = 1
|
||||
for(var/datum/objective/objective in traitor.objectives)
|
||||
traitor.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
obj_count++
|
||||
*/
|
||||
|
||||
var/objectivetxt = ""
|
||||
var/obj_count = 1
|
||||
for(var/datum/objective/objective in traitor.objectives)
|
||||
objectivetxt += "<B>Objective #[obj_count]</B>: [objective.explanation_text]<br>"
|
||||
obj_count++
|
||||
|
||||
var/datum/faction/syndicate/syndifaction = traitor.faction
|
||||
|
||||
var/dat = {"
|
||||
|
||||
<b><font size=3 color=red><center>You are a traitor!</center></font></b><br><br>
|
||||
|
||||
<font color='#8C0000'>You have been hired by an associate of the Syndicate Coalition. The Syndicate Coalition is a group of several companies, organizations, and terrorist groups that share the common interest of foiling Nanotrasen in every way possible. You now work for <b>[syndifaction]</b>, a key member of the coalition.. It is highly recommended you take some time to read familiarize yourself with your faction:</font><br><br>
|
||||
|
||||
[syndifaction.desc]<br><br>
|
||||
|
||||
You have been assigned to complete the following objectives before the end of your shift:<br>
|
||||
[objectivetxt]<br>
|
||||
|
||||
[syndifaction.name] would finally like to add: <i>\"[syndifaction.operative_notes]\"</i>
|
||||
"}
|
||||
|
||||
traitor.current << browse("<HEAD><TITLE>You are a traitor!</TITLE></HEAD>[dat]", "window=traitorgreet;size=700x500")
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -207,10 +274,11 @@
|
||||
if (traitor_mob.mind)
|
||||
if (traitor_mob.mind.assigned_role == "Clown")
|
||||
traitor_mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
|
||||
traitor_mob.mutations &= ~CLUMSY
|
||||
traitor_mob.mutations.Remove(CLUMSY)
|
||||
|
||||
// find a radio! toolbox(es), backpack, belt, headset
|
||||
var/loc = ""
|
||||
var/datum/faction/syndicate/faction = traitor_mob.mind.faction
|
||||
var/obj/item/device/R = null //Hide the uplink in a PDA if available, otherwise radio
|
||||
if (!R && istype(traitor_mob.belt, /obj/item/device/pda))
|
||||
R = traitor_mob.belt
|
||||
@@ -276,30 +344,79 @@
|
||||
T.name = R.name
|
||||
T.icon_state = R.icon_state
|
||||
T.origradio = R
|
||||
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
|
||||
|
||||
T.item_data = faction.uplink_contents
|
||||
if(!T.item_data)
|
||||
T.item_data = uplink_items
|
||||
T.welcome = "[faction.name] Uplink Console"
|
||||
if(!T.welcome)
|
||||
T.welcome = uplink_welcome
|
||||
|
||||
traitor_mob << "The [faction.name] have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
|
||||
traitor_mob.mind.store_memory("<B>Radio Freq:</B> [format_frequency(freq)] ([R.name] [loc]).")
|
||||
else if (istype(R, /obj/item/device/pda))
|
||||
// generate a passcode if the uplink is hidden in a PDA
|
||||
var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]"
|
||||
var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega","Charlie","Zeta","Oscar","Papa","Echo","Foxtrot","Tango","Raptor","Sierra","India","Xray","Zulu","Yankee","Rosebud","Greenwich","Atlanta","Roger","Mayday","Toady","Relic")]"
|
||||
|
||||
if(prob(15))
|
||||
var/extrastuff = ""
|
||||
for(var/i = 1, i <= rand(1,4), i++)
|
||||
extrastuff += pick("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","1","2","3","4","5","6","7","8","9","0","-","/","+","_","@")
|
||||
|
||||
if(prob(50))
|
||||
pda_pass = "[pda_pass]-[extrastuff]"
|
||||
else
|
||||
pda_pass = "[extrastuff]-[pda_pass]"
|
||||
|
||||
var/obj/item/device/uplink/pda/T = new /obj/item/device/uplink/pda(R)
|
||||
R:uplink = T
|
||||
T.lock_code = pda_pass
|
||||
T.hostpda = R
|
||||
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."
|
||||
|
||||
T.item_data = faction.uplink_contents
|
||||
if(!T.item_data)
|
||||
T.item_data = uplink_items
|
||||
T.welcome = "[faction.name] Uplink Console"
|
||||
if(!T.welcome)
|
||||
T.welcome = uplink_welcome
|
||||
|
||||
traitor_mob << "[faction.name] 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.
|
||||
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 << "Unfortunately, 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(faction.friendly_identification == 0)
|
||||
traitor_mob << "[faction.name] have not provided you with identification codes or the identity of other agents. You are completely anonymous."
|
||||
|
||||
else if(faction.friendly_identification == 1)
|
||||
|
||||
traitor_mob << "[faction.name] 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, [faction.name] 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 << "Unfortunately, [faction.name] 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."
|
||||
|
||||
else if(faction.friendly_identification == 2)
|
||||
var/list/allies = list()
|
||||
for(var/datum/faction/syndicate/F in faction.alliances)
|
||||
for(var/datum/mind/M in F.members)
|
||||
allies.Add(M)
|
||||
|
||||
if(length(allies + faction.members) > 1)
|
||||
traitor_mob << "[faction.name] have provided you with precise identities of allied Syndicate operatives."
|
||||
for(var/datum/mind/M in allies + faction.members)
|
||||
if(M != traitor_mob.mind)
|
||||
traitor_mob << "\red Confirmed Syndicate ally: \black [M.current] - [M.assigned_job.title]"
|
||||
traitor_mob.mind.store_memory("<b>Confirmed Syndicate ally</b>: [M.current] - [M.assigned_job.title] ([M.faction.name])")
|
||||
|
||||
else
|
||||
traitor_mob << "[faction.name] have informed you that you are their only operative on the station."
|
||||
|
||||
//End code phrase.
|
||||
|
||||
@@ -489,13 +489,13 @@
|
||||
usr.spellvoice()
|
||||
|
||||
usr << text("\blue You feel strong! You feel pressure building behind your eyes!")
|
||||
if (!(usr.mutations & HULK))
|
||||
usr.mutations |= HULK
|
||||
if (!(usr.mutations & LASER))
|
||||
usr.mutations |= LASER
|
||||
if (!(HULK in usr.mutations))
|
||||
usr.mutations.Add(HULK)
|
||||
if (!(LASER in usr.mutations))
|
||||
usr.mutations.Add(LASER)
|
||||
spawn (300)
|
||||
if (usr.mutations & LASER) usr.mutations &= ~LASER
|
||||
if (usr.mutations & HULK) usr.mutations &= ~HULK
|
||||
if (LASER in usr.mutations) usr.mutations.Remove(LASER)
|
||||
if (HULK in usr.mutations) usr.mutations.Remove(HULK)
|
||||
return
|
||||
|
||||
//BODY SWAP /N
|
||||
|
||||
@@ -145,6 +145,12 @@ obj/hud/New(var/type = 0)
|
||||
if(ishuman(mymob))
|
||||
human_hud(mymob.UI) // Pass the player the UI style chosen in preferences
|
||||
|
||||
spawn()
|
||||
if((RADAR in mymob.augmentations) && mymob.radar_open)
|
||||
mymob:start_radar()
|
||||
else if(RADAR in mymob.augmentations)
|
||||
mymob:place_radar_closed()
|
||||
|
||||
else if(ismonkey(mymob))
|
||||
monkey_hud(mymob.UI)
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
H.equip_if_possible(new /obj/item/weapon/stamp/clown(H), H.slot_in_backpack)
|
||||
H.equip_if_possible(new /obj/item/toy/crayon/rainbow(H), H.slot_in_backpack)
|
||||
H.equip_if_possible(new /obj/item/weapon/storage/crayonbox(H), H.slot_in_backpack)
|
||||
H.mutations |= CLOWN
|
||||
H.mutations.Add(CLUMSY)
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
return
|
||||
|
||||
/obj/machinery/optable/attack_paw(mob/user as mob)
|
||||
if ((usr.mutations & HULK))
|
||||
if ((HULK in usr.mutations))
|
||||
usr << text("\blue You destroy the operating table.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
@@ -67,7 +67,7 @@
|
||||
return
|
||||
|
||||
/obj/machinery/optable/attack_hand(mob/user as mob)
|
||||
if ((usr.mutations & HULK))
|
||||
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
usr << text("\blue You destroy the table.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
|
||||
@@ -242,7 +242,7 @@ Auto Patrol: []"},
|
||||
var/mob/living/carbon/M = src.target
|
||||
var/maxstuns = 4
|
||||
if (istype(M, /mob/living/carbon/human))
|
||||
if (M.stuttering < 10 && (!(M.mutations & HULK)) /*&& (!istype(M:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
|
||||
if (M.stuttering < 10 && (!(HULK in M.mutations)) /*&& (!istype(M:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
|
||||
M.stuttering = 10
|
||||
M.Stun(10)
|
||||
M.Weaken(10)
|
||||
|
||||
@@ -223,7 +223,7 @@ Auto Patrol: []"},
|
||||
var/mob/living/carbon/M = src.target
|
||||
var/maxstuns = 4
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
if(M.stuttering < 10 && (!(M.mutations & HULK)))
|
||||
if(M.stuttering < 10 && (!(HULK in M.mutations)))
|
||||
M.stuttering = 10
|
||||
M.Stun(10)
|
||||
M.Weaken(10)
|
||||
|
||||
@@ -391,7 +391,7 @@
|
||||
if ((!subject.ckey) || (!subject.client))
|
||||
src.temp = "Error: Mental interface failure."
|
||||
return
|
||||
if (subject.mutations & NOCLONE)
|
||||
if (NOCLONE in subject.mutations)
|
||||
src.temp = "Error: Mental interface failure."
|
||||
return
|
||||
if (!isnull(find_record(subject.ckey)))
|
||||
|
||||
@@ -222,4 +222,5 @@ Class Procs:
|
||||
|
||||
/obj/machinery/proc/assign_uid()
|
||||
uid = gl_uid
|
||||
gl_uid++
|
||||
gl_uid++
|
||||
|
||||
|
||||
@@ -211,9 +211,15 @@
|
||||
|
||||
if(href_list["delete"])
|
||||
|
||||
var/x = freq_listening[text2num(href_list["delete"])]
|
||||
temp = "<font color = #666633>-% Removed frequency filter [x] %-</font color>"
|
||||
freq_listening.Remove(x)
|
||||
// changed the layout about to workaround a pesky runtime -- Doohl
|
||||
|
||||
var/freq_remove = text2num(href_list["delete"])
|
||||
for(var/x in freq_listening)
|
||||
if(x == freq_remove)
|
||||
|
||||
temp = "<font color = #666633>-% Removed frequency filter [x] %-</font color>"
|
||||
freq_listening.Remove(x)
|
||||
break
|
||||
|
||||
if(href_list["unlink"])
|
||||
|
||||
|
||||
@@ -167,18 +167,6 @@
|
||||
|
||||
if(traffic > 0)
|
||||
traffic -= netspeed
|
||||
/* Machine checks */
|
||||
if(on)
|
||||
if(machinetype == 2) // bus mainframes
|
||||
switch(traffic)
|
||||
if(-100 to 49)
|
||||
icon_state = initial(icon_state)
|
||||
if(50 to 200)
|
||||
icon_state = "bus2"
|
||||
else
|
||||
icon_state = "bus3"
|
||||
|
||||
// Check heat and generate some
|
||||
|
||||
proc/checkheat()
|
||||
// Checks heat from the environment and applies any integrity damage
|
||||
@@ -270,7 +258,7 @@
|
||||
/obj/machinery/telecomms/bus
|
||||
name = "Bus Mainframe"
|
||||
icon = 'stationobjs.dmi'
|
||||
icon_state = "bus1"
|
||||
icon_state = "bus"
|
||||
desc = "A mighty piece of hardware used to send massive amounts of data quickly."
|
||||
density = 1
|
||||
anchored = 1
|
||||
|
||||
@@ -950,7 +950,7 @@ var/list/sacrificed = list()
|
||||
usr.say("Fuu ma'jin!")
|
||||
for(var/mob/living/carbon/C in viewers(src))
|
||||
flick("e_flash", C.flash)
|
||||
if (C.stuttering < 1 && (!(C.mutations & HULK)))
|
||||
if (C.stuttering < 1 && (!(HULK in C.mutations)))
|
||||
C.stuttering = 1
|
||||
C.Weaken(1)
|
||||
C.Stun(1)
|
||||
@@ -966,7 +966,7 @@ var/list/sacrificed = list()
|
||||
for(var/mob/O in viewers(T, null))
|
||||
O.show_message(text("\red <B>[] invokes a talisman at []</B>", usr, T), 1)
|
||||
flick("e_flash", T.flash)
|
||||
if (!(T.mutations & HULK))
|
||||
if (!(HULK in T.mutations))
|
||||
T.silent += 15
|
||||
T.Weaken(25)
|
||||
T.Stun(25)
|
||||
|
||||
@@ -53,6 +53,7 @@ datum/controller/game_controller
|
||||
|
||||
setupgenetics()
|
||||
|
||||
|
||||
for(var/i = 0, i < max_secret_rooms, i++)
|
||||
make_mining_asteroid_secret()
|
||||
|
||||
@@ -64,6 +65,8 @@ datum/controller/game_controller
|
||||
if(!ticker)
|
||||
ticker = new /datum/controller/gameticker()
|
||||
|
||||
setupfactions()
|
||||
|
||||
spawn
|
||||
ticker.pregame()
|
||||
|
||||
|
||||
@@ -423,7 +423,7 @@
|
||||
call(/obj/item/clothing/gloves/space_ninja/proc/drain)("MECHA",src,user:wear_suit)
|
||||
return
|
||||
|
||||
if (user.mutations & HULK && !prob(src.deflect_chance))
|
||||
if ( ((HULK in user.mutations) || (SUPRSTR in user.augmentations)) && !prob(src.deflect_chance))
|
||||
src.take_damage(15)
|
||||
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
|
||||
user.visible_message("<font color='red'><b>[user] hits [src.name], doing some damage.</b></font>", "<font color='red'><b>You hit [src.name] with all your might. The metal creaks and bends.</b></font>")
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
return
|
||||
|
||||
/obj/effect/alien/resin/attack_hand()
|
||||
if ((usr.mutations & HULK))
|
||||
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
usr << "\blue You easily destroy the [name]."
|
||||
for(var/mob/O in oviewers(src))
|
||||
O.show_message("\red [usr] destroys the [name]!", 1)
|
||||
@@ -131,7 +131,7 @@
|
||||
contents.Add(affecting)
|
||||
|
||||
while(!isnull(M)&&!isnull(src))//While M and wall exist
|
||||
if(prob(90)&& M.mutations & HULK)//If they're the Hulk, they're getting out.
|
||||
if(prob(90)&& HULK in M.mutations)//If they're the Hulk, they're getting out.
|
||||
M << "You smash your way to freedom!"
|
||||
break
|
||||
if(prob(30))//Let's people know that someone is trapped in the resin wall.
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
var/last_used = 0 //last world.time it was used.
|
||||
|
||||
/obj/item/device/flash/proc/clown_check(var/mob/user)
|
||||
if(user && (user.mutations & CLUMSY) && prob(50))
|
||||
if(user && (CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red The Flash slips out of your hand."
|
||||
user.drop_item()
|
||||
return 0
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
/obj/item/device/flashlight/attack(mob/M as mob, mob/user as mob)
|
||||
src.add_fingerprint(user)
|
||||
if(src.on && user.zone_sel.selecting == "eyes")
|
||||
if ((user.mutations & CLUMSY || user.getBrainLoss() >= 60) && prob(50))//too dumb to use flashlight properly
|
||||
if (((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))//too dumb to use flashlight properly
|
||||
return ..()//just hit them in the head
|
||||
|
||||
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")//don't have dexterity
|
||||
@@ -69,7 +69,7 @@
|
||||
if(M.stat > 1 || M.sdisabilities & 1)//mob is dead or fully blind
|
||||
if(M!=user)
|
||||
user.show_message(text("\red [] pupils does not react to the light!", M),1)
|
||||
else if(M.mutations & XRAY)//mob has X-RAY vision
|
||||
else if(XRAY in M.mutations)//mob has X-RAY vision
|
||||
if(M!=user)
|
||||
user.show_message(text("\red [] pupils give an eerie glow!", M),1)
|
||||
else //nothing wrong
|
||||
|
||||
@@ -76,7 +76,7 @@ MASS SPECTROMETER
|
||||
var/mode = 1;
|
||||
|
||||
/obj/item/device/healthanalyzer/attack(mob/M as mob, mob/user as mob)
|
||||
if ((user.mutations & CLUMSY || user.getBrainLoss() >= 60) && prob(50))
|
||||
if (( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))
|
||||
user << text("\red You try to analyze the floor's vitals!")
|
||||
for(var/mob/O in viewers(M, null))
|
||||
O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1)
|
||||
|
||||
61
code/game/objects/devices/traitordevices.dm
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
|
||||
Miscellaneous traitor devices
|
||||
|
||||
BATTERER
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
The Batterer, like a flashbang but 50% chance to knock people over. Can be either very
|
||||
effective or pretty fucking useless.
|
||||
|
||||
*/
|
||||
|
||||
/obj/item/device/batterer
|
||||
name = "mind batterer"
|
||||
desc = "A strange device with twin antennas."
|
||||
icon_state = "batterer"
|
||||
throwforce = 5
|
||||
w_class = 1.0
|
||||
throw_speed = 4
|
||||
throw_range = 10
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
item_state = "electronic"
|
||||
origin_tech = "magnets=3;combat=3;syndicate=3"
|
||||
|
||||
var/times_used = 0 //Number of times it's been used.
|
||||
var/max_uses = 2
|
||||
|
||||
|
||||
/obj/item/device/batterer/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0)
|
||||
if(!user) return
|
||||
if(times_used >= max_uses)
|
||||
user << "\red The mind batterer has been burnt out!"
|
||||
return
|
||||
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used [src] to knock down people in the area.</font>")
|
||||
|
||||
for(var/mob/living/carbon/human/M in orange(10, user))
|
||||
spawn()
|
||||
if(prob(50))
|
||||
|
||||
M.Weaken(rand(10,20))
|
||||
if(prob(25))
|
||||
M.Stun(rand(5,10))
|
||||
M << "\red <b>You feel a tremendous, paralyzing wave flood your mind.</b>"
|
||||
|
||||
else
|
||||
M << "\red <b>You feel a sudden, electric jolt travel through your head.</b>"
|
||||
|
||||
playsound(src.loc, 'interference.ogg', 50, 1)
|
||||
user << "\blue You trigger [src]."
|
||||
times_used += 1
|
||||
if(times_used >= max_uses)
|
||||
icon_state = "battererburnt"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -999,7 +999,7 @@ steam.start() -- spawns the effect
|
||||
return
|
||||
|
||||
attack_hand(var/mob/user)
|
||||
if (user.mutations & HULK || (prob(75 - metal*25)))
|
||||
if ((HULK in user.mutations) || (prob(75 - metal*25)) || (SUPRSTR in user.augmentations))
|
||||
user << "\blue You smash through the metal foam wall."
|
||||
for(var/mob/O in oviewers(user))
|
||||
if ((O.client && !( O.blinded )))
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
user.visible_message("[user.name] kicks the [src.name].", \
|
||||
"You kick the [src.name].", \
|
||||
"You hear a noise")
|
||||
if((usr.mutations & HULK))
|
||||
if((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
src.health -= 5
|
||||
else if(!shock(user, 70))
|
||||
src.health -= 3
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
M.handcuffed = new /obj/item/weapon/handcuffs(M)
|
||||
|
||||
else
|
||||
if ((usr.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in usr.mutations) && prob(50))
|
||||
usr << "\red Uh ... how do those things work?!"
|
||||
if (istype(M, /mob/living/carbon/human))
|
||||
if(!M.handcuffed)
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
if(5.0)
|
||||
t = "huge"
|
||||
else
|
||||
if ((usr.mutations & CLUMSY) && prob(50)) t = "funny-looking"
|
||||
if ((CLUMSY in usr.mutations) && prob(50)) t = "funny-looking"
|
||||
usr << text("This is a []\icon[][]. It is a [] item.", !src.blood_DNA ? "" : "bloody ",src, src.name, t)
|
||||
if(src.desc)
|
||||
usr << src.desc
|
||||
@@ -194,6 +194,9 @@
|
||||
/////////////////////////
|
||||
|
||||
var/power = src.force
|
||||
if((HULK in user.mutations) || (SUPRSTR in user.augmentations))
|
||||
power *= 2
|
||||
|
||||
if(!istype(M, /mob/living/carbon/human))
|
||||
if(istype(M, /mob/living/carbon/metroid))
|
||||
var/mob/living/carbon/metroid/Metroid = M
|
||||
@@ -297,7 +300,7 @@
|
||||
if (istype(location, /turf/simulated))
|
||||
location.add_blood_floor(M)
|
||||
if("fire")
|
||||
if (!(M.mutations & COLD_RESISTANCE))
|
||||
if (!(COLD_RESISTANCE in M.mutations))
|
||||
M.take_organ_damage(0, power)
|
||||
M << "Aargh it burns!"
|
||||
M.updatehealth()
|
||||
@@ -338,7 +341,7 @@
|
||||
log_attack("<font color='red'> [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
src.add_fingerprint(user)
|
||||
//if((user.mutations & CLUMSY) && prob(50))
|
||||
//if((CLUMSY in user.mutations) && prob(50))
|
||||
// M = user
|
||||
/*
|
||||
M << "\red You stab yourself in the eye."
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
if(!host)
|
||||
del(src)
|
||||
return
|
||||
if(!host.mutations & TK)
|
||||
if(!(TK in host.mutations))
|
||||
del(src)
|
||||
return
|
||||
if(!focus)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/weapon/dnainjector/proc/inject(mob/M as mob)
|
||||
M.radiation += rand(20,50)
|
||||
|
||||
if (!(M.mutations & NOCLONE)) // prevents drained people from having their DNA changed
|
||||
if (!(NOCLONE in M.mutations)) // prevents drained people from having their DNA changed
|
||||
if (dnatype == "ui")
|
||||
if (!block) //isolated block?
|
||||
if (ue) //unique enzymes? yes
|
||||
|
||||
@@ -68,7 +68,7 @@ FLASHBANG
|
||||
|
||||
|
||||
clown_check(var/mob/living/user)
|
||||
if((user.mutations & CLUMSY) && prob(50))
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red Huh? How does this thing work?!"
|
||||
src.active = 1
|
||||
src.icon_state = "empar"
|
||||
@@ -170,7 +170,7 @@ FLASHBANG
|
||||
if(ishuman(M))
|
||||
if(istype(M:ears, /obj/item/clothing/ears/earmuffs))
|
||||
ear_safety += 2
|
||||
if(M.mutations & HULK)
|
||||
if(HULK in M.mutations)
|
||||
ear_safety += 1
|
||||
if(istype(M:head, /obj/item/clothing/head/helmet))
|
||||
ear_safety += 1
|
||||
@@ -269,7 +269,7 @@ FLASHBANG
|
||||
|
||||
|
||||
clown_check(var/mob/living/user)
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red Huh? How does this thing work?!"
|
||||
src.active = 1
|
||||
src.icon_state = "flashbang1"
|
||||
|
||||
@@ -35,13 +35,13 @@
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] ([src.imp.name]) to implant [M.name] ([M.ckey])</font>")
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) implanted [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
user.show_message("\red You implanted the implant into [M].")
|
||||
src.imp.loc = M
|
||||
src.imp.imp_in = M
|
||||
src.imp.implanted = 1
|
||||
src.imp.implanted(M)
|
||||
src.imp = null
|
||||
user.show_message("\red You implanted the implant into [M].")
|
||||
src.icon_state = "implanter0"
|
||||
update()
|
||||
return
|
||||
|
||||
|
||||
|
||||
179
code/game/objects/items/weapons/implants/implantnanoaug.dm
Normal file
@@ -0,0 +1,179 @@
|
||||
/obj/item/weapon/implant/nanoaug
|
||||
name = "nanoaug"
|
||||
desc = "A nano-robotic biological augmentation implant."
|
||||
var/augmentation
|
||||
var/augment_text = "You feel strange..."
|
||||
var/activation_emote = "fart"
|
||||
|
||||
get_data()
|
||||
var/dat = {"
|
||||
<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> Cybersun Industries Nano-Robotic Biological Augmentation Suite<BR>
|
||||
<b>Life:</b> Infinite. WARNING: Biological chances are irreversable.<BR>
|
||||
<b>Important Notes:</b> <font color='red'>Illegal</font>. Subjects exposed to nanorobotic agent are considered dangerous.<BR>
|
||||
<HR>
|
||||
<b>Implant Details:</b><BR>
|
||||
<b>Function:</b> Implant contains colony of pre-programmed nanorobots. Subject will experience radical changes in their body, amplifying and improving certain bodily characteristics.<BR>
|
||||
<b>Special Features:</b> Will grant subject superhuman powers.<BR>
|
||||
<b>Integrity:</b> Nanoaugmentation is permanent. Once the process is complete, the nanorobots disassemble and are dissolved by the blood stream."}
|
||||
return dat
|
||||
|
||||
|
||||
implanted(mob/M as mob)
|
||||
if(!istype(M, /mob/living/carbon/human)) return
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.augmentations.Add(augmentation) // give them the mutation
|
||||
H << "\blue [augment_text]"
|
||||
if(istype(src, /obj/item/weapon/implant/nanoaug/eswordsynth))
|
||||
activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
|
||||
H.mind.store_memory("Freedom nanoaugmentation can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
|
||||
H << "The nanoaugmentation implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
|
||||
|
||||
if(istype(src, /obj/item/weapon/implant/nanoaug/radar))
|
||||
H << "<font color='#FF0000'>Red</font color> blips on the map are Security."
|
||||
H << "White blips are civlians."
|
||||
H << "<font color='#3E710B'>Monochrome Green</font color> blips are cyborgs and AIs."
|
||||
H << "<font color='#238989'>Light blue</font color> blips are heads of staff."
|
||||
H << "<font color='#663366'>Purple</font color> blips are unidentified organisms."
|
||||
H << "Dead biologicals will not display on the radar."
|
||||
|
||||
spawn()
|
||||
H.start_radar()
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/implant/nanoaug/strength
|
||||
name = "Superhuman Strength"
|
||||
augmentation = SUPRSTR
|
||||
augment_text = "You muscle ache, and you feel a rapid surge of energy pulse through your body. You feel strong."
|
||||
|
||||
/obj/item/weapon/implant/nanoaug/radar
|
||||
name = "Short-range Psionic Radar"
|
||||
augmentation = RADAR
|
||||
augment_text = "You begin to sense the presence or lack of presence of others around you."
|
||||
|
||||
/obj/item/weapon/implant/nanoaug/electrichands
|
||||
name = "Electric Hands"
|
||||
augmentation = ELECTRICHANDS
|
||||
augment_text = "You feel a sudden jolt of electricity pulse through your veins. Arcs of electricity travel through your hands."
|
||||
|
||||
/obj/item/weapon/implant/nanoaug/eswordsynth
|
||||
name = "Energy Blade Synthesizer"
|
||||
augmentation = ESWORDSYNTH
|
||||
augment_text = "Your hands throb and pulsate. They feel sharper, and strangely hot."
|
||||
|
||||
trigger(emote, source as mob)
|
||||
if(emote == activation_emote)
|
||||
src.activate(source)
|
||||
return
|
||||
|
||||
activate(var/mob/source)
|
||||
|
||||
var/obj/item/weapon/melee/energy/blade/swordspawn = new /obj/item/weapon/melee/energy/blade
|
||||
if(!source.get_active_hand())
|
||||
source.put_in_hand(swordspawn)
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
||||
spark_system.set_up(5, 0, source.loc)
|
||||
spark_system.start()
|
||||
playsound(source.loc, "sparks", 50, 1)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/implant/nanoaug/rebreather
|
||||
name = "Bioelectric Rebreather"
|
||||
augmentation = REBREATHER
|
||||
augment_text = "You begin to lose your breath. Just as you are about to pass out, you suddenly lose the urge to breath. Breathing is no longer a necessity for you."
|
||||
|
||||
/obj/item/weapon/implant/nanoaug/dermalarmor
|
||||
name = "Skin-intergrated Dermal Armor"
|
||||
augmentation = DERMALARMOR
|
||||
augment_text = "The skin throughout your body grows tense and tight, and you become slightly stiff. Your bones and skin feel a lot stronger."
|
||||
|
||||
/obj/item/weapon/implant/nanoaug/reflexes
|
||||
name = "Combat Reflexes"
|
||||
augmentation = REFLEXES
|
||||
augment_text = "Your mind suddenly is able to identify threats before you are aware of them. You become more aware of your surroundings."
|
||||
|
||||
/obj/item/weapon/implant/nanoaug/nanoregen
|
||||
name = "Regenerative Nanobots"
|
||||
augmentation = NANOREGEN
|
||||
augment_text = "You feel a very faint vibration in your body. You instantly feel much younger."
|
||||
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug
|
||||
name = "Nanoaugmentation Implanter (Empty)"
|
||||
icon_state = "nanoimplant"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/update()
|
||||
if (src.imp)
|
||||
src.icon_state = "nanoimplant"
|
||||
else
|
||||
src.icon_state = "nanoimplant0"
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/strength
|
||||
name = "Nanoaugmentation Implaner (Superhuman Strength)"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/strength/New()
|
||||
src.imp = new /obj/item/weapon/implant/nanoaug/strength( src )
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/radar
|
||||
name = "Nanoaugmentation Implaner (Short-range Psionic Radar)"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/radar/New()
|
||||
src.imp = new /obj/item/weapon/implant/nanoaug/radar( src )
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/electrichands
|
||||
name = "Nanoaugmentation Implaner (Electric Hands)"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/electrichands/New()
|
||||
src.imp = new /obj/item/weapon/implant/nanoaug/electrichands( src )
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/eswordsynth
|
||||
name = "Nanoaugmentation Implaner (Energy Blade Synthesizer)"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/eswordsynth/New()
|
||||
src.imp = new /obj/item/weapon/implant/nanoaug/eswordsynth( src )
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/rebreather
|
||||
name = "Nanoaugmentation Implaner (Bioelectric Rebreather)"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/rebreather/New()
|
||||
src.imp = new /obj/item/weapon/implant/nanoaug/rebreather( src )
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/dermalarmor
|
||||
name = "Nanoaugmentation Implaner (Skin-intergrated Dermal Armor)"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/dermalarmor/New()
|
||||
src.imp = new /obj/item/weapon/implant/nanoaug/dermalarmor( src )
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/reflexes
|
||||
name = "Nanoaugmentation Implaner (Combat Reflexes)"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/reflexes/New()
|
||||
src.imp = new /obj/item/weapon/implant/nanoaug/reflexes( src )
|
||||
..()
|
||||
update()
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/nanoregen
|
||||
name = "Nanoaugmentation Implaner (Regenerative Nanobots)"
|
||||
|
||||
/obj/item/weapon/implanter/nanoaug/nanoregen/New()
|
||||
src.imp = new /obj/item/weapon/implant/nanoaug/nanoregen( src )
|
||||
..()
|
||||
update()
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ KNIFE
|
||||
src.icon_state = "fork"
|
||||
return
|
||||
else
|
||||
if((user.mutations & CLUMSY) && prob(50))
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
return eyestab(M,user)
|
||||
|
||||
@@ -47,7 +47,7 @@ KNIFE
|
||||
// ROLLING PIN
|
||||
|
||||
/obj/item/weapon/kitchen/rollingpin/attack(mob/M as mob, mob/living/user as mob)
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red The [src] slips out of your hand and hits your head."
|
||||
user.take_organ_damage(10)
|
||||
user.Paralyse(2)
|
||||
@@ -84,7 +84,7 @@ KNIFE
|
||||
// KNIFE
|
||||
|
||||
/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red You accidentally cut yourself with the [src]."
|
||||
user.take_organ_damage(20)
|
||||
return
|
||||
@@ -107,7 +107,7 @@ KNIFE
|
||||
sleep(rand(2,4))
|
||||
|
||||
|
||||
if((user.mutations & CLUMSY) && prob(50)) //What if he's a clown?
|
||||
if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
|
||||
M << "\red You accidentally slam yourself with the [src]!"
|
||||
M.Weaken(1)
|
||||
user.take_organ_damage(2)
|
||||
|
||||
@@ -256,7 +256,7 @@ CIRCULAR SAW
|
||||
|
||||
//if(M.mutations & HUSK) return ..()
|
||||
|
||||
if((user.mutations & CLUMSY) && prob(50))
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
return eyestab(M,user)
|
||||
|
||||
@@ -453,7 +453,7 @@ CIRCULAR SAW
|
||||
if(!istype(M))
|
||||
return ..()
|
||||
|
||||
if((user.mutations & CLUMSY) && prob(50))
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
return eyestab(M,user)
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ SWORD
|
||||
BLADE
|
||||
AXE
|
||||
STUN BATON
|
||||
ENERGY SHIELD (where else should i even put this)
|
||||
*/
|
||||
|
||||
|
||||
@@ -22,7 +23,7 @@ STUN BATON
|
||||
color = pick("red","blue","green","purple")
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/attack_self(mob/living/user as mob)
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red You accidentally cut yourself with [src]."
|
||||
user.take_organ_damage(5,5)
|
||||
active = !active
|
||||
@@ -103,7 +104,7 @@ STUN BATON
|
||||
|
||||
/obj/item/weapon/melee/baton/attack_self(mob/user as mob)
|
||||
src.status = !( src.status )
|
||||
if ((usr.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
usr << "\red You grab the stunbaton on the wrong side."
|
||||
usr.Paralyse(60)
|
||||
return
|
||||
@@ -119,7 +120,7 @@ STUN BATON
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/baton/attack(mob/M as mob, mob/user as mob)
|
||||
if ((usr.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in usr.mutations) && prob(50))
|
||||
usr << "\red You grab the stunbaton on the wrong side."
|
||||
usr.Weaken(30)
|
||||
return
|
||||
@@ -162,7 +163,7 @@ STUN BATON
|
||||
R.cell.charge -= 20
|
||||
else
|
||||
charges--
|
||||
if (M.stuttering < 1 && (!(M.mutations & HULK) && M.canstun) /*&& (!istype(H:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
|
||||
if (M.stuttering < 1 && (!(HULK in M.mutations) && M.canstun) /*&& (!istype(H:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
|
||||
M.stuttering = 1
|
||||
M.Stun(1)
|
||||
M.Weaken(1)
|
||||
@@ -173,7 +174,7 @@ STUN BATON
|
||||
R.cell.charge -= 20
|
||||
else
|
||||
charges--
|
||||
if (M.stuttering < 10 && (!(M.mutations & HULK) && M.canstun) /*&& (!istype(H:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
|
||||
if (M.stuttering < 10 && (!(HULK in M.mutations) && M.canstun) /*&& (!istype(H:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
|
||||
M.stuttering = 10
|
||||
M.Stun(10)
|
||||
M.Weaken(10)
|
||||
@@ -190,7 +191,7 @@ STUN BATON
|
||||
charges -= 5
|
||||
|
||||
/obj/item/weapon/melee/classic_baton/attack(mob/M as mob, mob/living/user as mob)
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red You club yourself over the head."
|
||||
user.Weaken(3 * force)
|
||||
if(ishuman(user))
|
||||
@@ -210,7 +211,7 @@ STUN BATON
|
||||
if (user.a_intent == "hurt")
|
||||
if(!..()) return
|
||||
playsound(src.loc, "swing_hit", 50, 1, -1)
|
||||
if (M.stuttering < 8 && (!(M.mutations & HULK)) /*&& (!istype(H:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
|
||||
if (M.stuttering < 8 && (!(HULK in M.mutations)) /*&& (!istype(H:wear_suit, /obj/item/clothing/suit/judgerobe))*/)
|
||||
M.stuttering = 8
|
||||
M.Stun(8)
|
||||
M.Weaken(8)
|
||||
@@ -222,3 +223,29 @@ STUN BATON
|
||||
M.Weaken(5)
|
||||
for(var/mob/O in viewers(M))
|
||||
if (O.client) O.show_message("\red <B>[M] has been stunned with the police baton by [user]!</B>", 1, "\red You hear someone fall", 2)
|
||||
|
||||
/obj/item/weapon/shield/energy/IsShield()
|
||||
if(active)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/shield/energy/attack_self(mob/living/user as mob)
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red You beat yourself in the head with [src]."
|
||||
user.take_organ_damage(5)
|
||||
active = !active
|
||||
if (active)
|
||||
force = 10
|
||||
icon_state = "eshield[active]"
|
||||
w_class = 4
|
||||
playsound(user, 'saberon.ogg', 50, 1)
|
||||
user << "\blue [src] is now active."
|
||||
else
|
||||
force = 3
|
||||
icon_state = "eshield[active]"
|
||||
w_class = 1
|
||||
playsound(user, 'saberoff.ogg', 50, 1)
|
||||
user << "\blue [src] can now be concealed."
|
||||
add_fingerprint(user)
|
||||
return
|
||||
@@ -36,7 +36,7 @@ WELDINGTOOOL
|
||||
if(!istype(M)) return ..()
|
||||
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
|
||||
return ..()
|
||||
if((user.mutations & CLUMSY) && prob(50))
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
return eyestab(M,user)
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
|
||||
/obj/item/weapon/firbang/afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
|
||||
if (user.equipped() == src)
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in usr.mutations) && prob(50))
|
||||
user << "\red Huh? How does this thing work?!"
|
||||
src.state = 1
|
||||
src.icon_state = "flashbang1"
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
/obj/item/weapon/firbang/attack_self(mob/user as mob)
|
||||
if (!src.state)
|
||||
if (user.mutations & CLUMSY)
|
||||
if (CLUMSY in user.mutations)
|
||||
user << "\red Huh? How does this thing work?!"
|
||||
spawn( 5 )
|
||||
prime()
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
new /obj/item/weapon/pen(src)
|
||||
|
||||
/obj/item/weapon/secstorage/sbriefcase/attack(mob/M as mob, mob/living/user as mob)
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red The [src] slips out of your hand and hits your head."
|
||||
user.take_organ_damage(10)
|
||||
user.Paralyse(2)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
user.take_organ_damage(0,10)
|
||||
return
|
||||
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red The [src] slips out of your hand and hits your head."
|
||||
user.take_organ_damage(10)
|
||||
user.Paralyse(20)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/obj/item/weapon/storage/briefcase/attack(mob/M as mob, mob/living/user as mob)
|
||||
//..()
|
||||
|
||||
if ((user.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user << "\red The [src] slips out of your hand and hits your head."
|
||||
user.take_organ_damage(10)
|
||||
user.Paralyse(2)
|
||||
|
||||
@@ -38,7 +38,7 @@ TABLE AND RACK OBJECT INTERATIONS
|
||||
|
||||
|
||||
/obj/structure/table/attack_paw(mob/user as mob)
|
||||
if ((usr.mutations & HULK))
|
||||
if ((HULK in usr.mutations))
|
||||
usr << "\blue You destroy the table."
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
@@ -98,7 +98,7 @@ TABLE AND RACK OBJECT INTERATIONS
|
||||
|
||||
|
||||
/obj/structure/table/attack_hand(mob/user as mob)
|
||||
if ((usr.mutations & HULK))
|
||||
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
usr << "\blue You destroy the table."
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
|
||||
@@ -21,6 +21,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
|
||||
var/welcome // Welcoming menu message
|
||||
var/menu_message = "" // The actual menu text
|
||||
var/items // List of items
|
||||
var/item_data // raw item text
|
||||
var/list/ItemList // Parsed list of items
|
||||
var/uses // Numbers of crystals
|
||||
// List of items not to shove in their hands.
|
||||
@@ -28,7 +29,10 @@ A list of items and costs is stored under the datum of every game mode, alongsid
|
||||
|
||||
New()
|
||||
welcome = ticker.mode.uplink_welcome
|
||||
items = dd_replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items
|
||||
if(!item_data)
|
||||
items = dd_replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items
|
||||
else
|
||||
items = dd_replacetext(item_data)
|
||||
ItemList = dd_text2list(src.items, ";") // Parsing the items text string
|
||||
uses = ticker.mode.uplink_uses
|
||||
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
user << "\blue You arm the mousetrap."
|
||||
else
|
||||
icon_state = "mousetrap"
|
||||
if((user.getBrainLoss() >= 60 || user.mutations & CLUMSY) && prob(50))
|
||||
if(( (user.getBrainLoss() >= 60 || (CLUMSY in user.mutations)) && prob(50)))
|
||||
var/which_hand = "l_hand"
|
||||
if(!user.hand)
|
||||
which_hand = "r_hand"
|
||||
@@ -172,7 +172,7 @@
|
||||
|
||||
/obj/item/weapon/mousetrap/attack_hand(mob/user as mob)
|
||||
if(armed)
|
||||
if((user.getBrainLoss() >= 60 || user.mutations & CLUMSY) && prob(50))
|
||||
if(( (user.getBrainLoss() >= 60 || CLUMSY in user.mutations)) && prob(50))
|
||||
var/which_hand = "l_hand"
|
||||
if(!user.hand)
|
||||
which_hand = "r_hand"
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
//These all need to be rewritten to use visiblemessage()
|
||||
|
||||
/obj/structure/window/attack_hand()
|
||||
if ((usr.mutations & HULK))
|
||||
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
usr << "\blue You smash through the window."
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
@@ -106,7 +106,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/window/attack_paw()
|
||||
if ((usr.mutations & HULK))
|
||||
if ((HULK in usr.mutations))
|
||||
usr << "\blue You smash through the window."
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/carbon/proc/toggle_throw_mode()
|
||||
if(!equipped())//Not holding anything
|
||||
if(mutations & TK)
|
||||
if(TK in mutations)
|
||||
if (hand)
|
||||
l_hand = new/obj/item/tk_grab(src)
|
||||
l_hand:host = src
|
||||
@@ -92,7 +92,8 @@
|
||||
if(istype(A,/mob/living))
|
||||
if(A:lying) continue
|
||||
src.throw_impact(A)
|
||||
src.throwing = 0
|
||||
if(src.throwing == 1)
|
||||
src.throwing = 0
|
||||
if(isobj(A))
|
||||
if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
|
||||
src.throw_impact(A)
|
||||
@@ -105,9 +106,25 @@
|
||||
if(istype(hit_atom,/mob/living))
|
||||
var/mob/living/M = hit_atom
|
||||
M.visible_message("\red [hit_atom] has been hit by [src].")
|
||||
if(src.vars.Find("throwforce"))
|
||||
|
||||
if(!istype(src, /obj/item)) // this is a big item that's being thrown at them~
|
||||
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
var/armor_block = M:run_armor_check("chest", "melee")
|
||||
M:apply_damage(rand(20,45), BRUTE, "chest", armor_block)
|
||||
|
||||
visible_message("\red <B>[M] has been knocked down by the force of [src]!</B>")
|
||||
M:apply_effect(rand(4,12), WEAKEN, armor_block)
|
||||
|
||||
M:UpdateDamageIcon()
|
||||
else
|
||||
M.take_organ_damage(rand(20,45))
|
||||
|
||||
|
||||
else if(src.vars.Find("throwforce"))
|
||||
M.take_organ_damage(src:throwforce)
|
||||
|
||||
|
||||
else if(isobj(hit_atom))
|
||||
var/obj/O = hit_atom
|
||||
if(!O.anchored)
|
||||
@@ -132,8 +149,13 @@
|
||||
/atom/movable/proc/throw_at(atom/target, range, speed)
|
||||
if(!target || !src) return 0
|
||||
//use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target
|
||||
|
||||
src.throwing = 1
|
||||
|
||||
if(usr)
|
||||
if((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
src.throwing = 2 // really strong throw!
|
||||
|
||||
var/dist_x = abs(target.x - src.x)
|
||||
var/dist_y = abs(target.y - src.y)
|
||||
|
||||
|
||||
@@ -350,7 +350,7 @@
|
||||
dismantle_wall()
|
||||
|
||||
/turf/simulated/wall/attack_paw(mob/user as mob)
|
||||
if ((user.mutations & HULK))
|
||||
if ((HULK in user.mutations))
|
||||
if (prob(40))
|
||||
usr << text("\blue You smash through the wall.")
|
||||
dismantle_wall(1)
|
||||
@@ -380,7 +380,7 @@
|
||||
return
|
||||
|
||||
/turf/simulated/wall/attack_hand(mob/user as mob)
|
||||
if ((user.mutations & HULK))
|
||||
if ((HULK in user.mutations) || (SUPRSTR in user.augmentations))
|
||||
if (prob(40))
|
||||
usr << text("\blue You smash through the wall.")
|
||||
dismantle_wall(1)
|
||||
|
||||
@@ -347,7 +347,7 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
if (M.mutations & FAT)
|
||||
if (FAT in M.mutations)
|
||||
M.gib()
|
||||
..()
|
||||
return
|
||||
@@ -782,7 +782,7 @@ datum
|
||||
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.mutations = 0
|
||||
M.mutations = list()
|
||||
M.disabilities = 0
|
||||
M.sdisabilities = 0
|
||||
..()
|
||||
@@ -1566,6 +1566,12 @@ datum
|
||||
reagent_state = GAS
|
||||
color = "#404030" // rgb: 64, 64, 48
|
||||
|
||||
ultraglue
|
||||
name = "Ulta Glue"
|
||||
id = "glue"
|
||||
description = "An extremely powerful bonding agent."
|
||||
color = "#FFFFCC" // rgb: 255, 255, 204
|
||||
|
||||
diethylamine
|
||||
name = "Diethylamine"
|
||||
id = "diethylamine"
|
||||
|
||||
@@ -954,7 +954,7 @@
|
||||
if(!T.dna)
|
||||
usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)"
|
||||
return
|
||||
if(T.mutations & NOCLONE) //target done been et, no more blood in him
|
||||
if(NOCLONE in T.mutations) //target done been et, no more blood in him
|
||||
user << "\red You are unable to locate any blood."
|
||||
return
|
||||
B.holder = src
|
||||
|
||||
@@ -658,7 +658,7 @@
|
||||
if ("hurt")
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if (M.mutations & HULK)//HULK SMASH
|
||||
if ((HULK in M.mutations) || (SUPRSTR in M.augmentations))//HULK SMASH
|
||||
damage += 14
|
||||
spawn(0)
|
||||
Paralyse(5)
|
||||
|
||||
@@ -127,15 +127,15 @@
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
if(src.getFireLoss())
|
||||
if(src.mutations & COLD_RESISTANCE || prob(50))
|
||||
if((COLD_RESISTANCE in src.mutations) || prob(50))
|
||||
switch(src.getFireLoss())
|
||||
if(1 to 50)
|
||||
src.adjustFireLoss(-1)
|
||||
if(51 to 100)
|
||||
src.adjustFireLoss(-5)
|
||||
|
||||
if (src.mutations & HULK && src.health <= 25)
|
||||
src.mutations &= ~HULK
|
||||
if ((HULK in src.mutations) && src.health <= 25)
|
||||
src.mutations.Remove(HULK)
|
||||
src << "\red You suddenly feel very weak."
|
||||
Weaken(3)
|
||||
emote("collapse")
|
||||
@@ -284,7 +284,7 @@
|
||||
breath.toxins -= toxins_used
|
||||
breath.oxygen += toxins_used
|
||||
|
||||
if(breath.temperature > (T0C+66) && !(src.mutations & COLD_RESISTANCE)) // Hot air hurts :(
|
||||
if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in src.mutations)) // Hot air hurts :(
|
||||
if(prob(20))
|
||||
src << "\red You feel a searing heat in your lungs!"
|
||||
fire_alert = max(fire_alert, 1)
|
||||
@@ -340,7 +340,7 @@
|
||||
thermal_protection += 0.2
|
||||
if(wear_suit && (wear_suit.flags & SUITSPACE))
|
||||
thermal_protection += 3
|
||||
if(src.mutations & COLD_RESISTANCE)
|
||||
if(COLD_RESISTANCE in src.mutations)
|
||||
thermal_protection += 5
|
||||
|
||||
return thermal_protection
|
||||
@@ -364,15 +364,15 @@
|
||||
|
||||
if(reagents) reagents.metabolize(src)
|
||||
|
||||
if(src.nutrition > 500 && !(src.mutations & FAT))
|
||||
if(src.nutrition > 500 && !(FAT in src.mutations))
|
||||
if(prob(5 + round((src.nutrition - 200) / 2)))
|
||||
src << "\red You suddenly feel blubbery!"
|
||||
src.mutations |= FAT
|
||||
src.mutations.Add(FAT)
|
||||
// update_body()
|
||||
if (src.nutrition < 100 && src.mutations & FAT)
|
||||
if (src.nutrition < 100 && (FAT in src.mutations))
|
||||
if(prob(round((50 - src.nutrition) / 100)))
|
||||
src << "\blue You feel fit again!"
|
||||
src.mutations &= ~FAT
|
||||
src.mutations.Remove(FAT)
|
||||
// update_body()
|
||||
if (src.nutrition > 0)
|
||||
src.nutrition -= HUNGER_FACTOR
|
||||
@@ -486,7 +486,7 @@
|
||||
|
||||
handle_regular_hud_updates()
|
||||
|
||||
if (src.stat == 2 || src.mutations & XRAY)
|
||||
if (src.stat == 2 || (XRAY in src.mutations))
|
||||
src.sight |= SEE_TURFS
|
||||
src.sight |= SEE_MOBS
|
||||
src.sight |= SEE_OBJS
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(70))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
@@ -430,7 +430,7 @@
|
||||
else
|
||||
var/damage = rand(1, 9)
|
||||
if (prob(90))
|
||||
if (M.mutations & HULK)
|
||||
if ((HULK in M.mutations) || (SUPRSTR in M.augmentations))
|
||||
damage += 5
|
||||
spawn(0)
|
||||
Paralyse(1)
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
breath.toxins -= toxins_used
|
||||
breath.oxygen += toxins_used
|
||||
|
||||
if(breath.temperature > (T0C+66) && !(mutations & COLD_RESISTANCE)) // Hot air hurts :(
|
||||
if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in src.mutations)) // Hot air hurts :(
|
||||
if(prob(20))
|
||||
src << "\red You feel a searing heat in your lungs!"
|
||||
fire_alert = max(fire_alert, 1)
|
||||
@@ -287,15 +287,15 @@
|
||||
|
||||
if(reagents) reagents.metabolize(src)
|
||||
|
||||
if(nutrition > 500 && !(mutations & FAT))
|
||||
if(nutrition > 500 && !(FAT in src.mutations))
|
||||
if(prob(5 + round((nutrition - 200) / 2)))
|
||||
src << "\red You suddenly feel blubbery!"
|
||||
mutations |= FAT
|
||||
mutations.Add(FAT)
|
||||
// update_body()
|
||||
if (nutrition < 100 && mutations & FAT)
|
||||
if (nutrition < 100 && (FAT in src.mutations))
|
||||
if(prob(round((50 - nutrition) / 100)))
|
||||
src << "\blue You feel fit again!"
|
||||
mutations &= ~FAT
|
||||
mutations.Add(FAT)
|
||||
// update_body()
|
||||
if (nutrition > 0)
|
||||
nutrition-= HUNGER_FACTOR
|
||||
@@ -409,7 +409,7 @@
|
||||
|
||||
handle_regular_hud_updates()
|
||||
|
||||
if (stat == 2 || mutations & XRAY)
|
||||
if (stat == 2 || (XRAY in src.mutations))
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
sight |= SEE_OBJS
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
|
||||
handle_regular_hud_updates()
|
||||
|
||||
if (stat == 2 || mutations & XRAY)
|
||||
if (stat == 2 || (XRAY in src.mutations))
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
sight |= SEE_OBJS
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
src.nutrition -= HUNGER_FACTOR/10
|
||||
if(src.m_intent == "run")
|
||||
src.nutrition -= HUNGER_FACTOR/10
|
||||
if(src.mutations & FAT && src.m_intent == "run" && src.bodytemperature <= 360)
|
||||
if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360)
|
||||
src.bodytemperature += 2
|
||||
|
||||
/mob/living/carbon/relaymove(var/mob/user, direction)
|
||||
|
||||
@@ -97,14 +97,14 @@
|
||||
return ..(gibbed)
|
||||
|
||||
/mob/living/carbon/human/proc/ChangeToHusk()
|
||||
if(mutations & HUSK)
|
||||
if(HUSK in src.mutations)
|
||||
return
|
||||
mutations |= HUSK
|
||||
mutations.Add(HUSK)
|
||||
real_name = "Unknown"
|
||||
update_body()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/Drain()
|
||||
ChangeToHusk()
|
||||
mutations |= NOCLONE
|
||||
mutations.Add(NOCLONE)
|
||||
return
|
||||
@@ -765,3 +765,163 @@
|
||||
src.hud_used.hotkey_ui_hidden = 1
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Radar-related things
|
||||
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/proc/close_radar()
|
||||
radar_open = 0
|
||||
for(var/obj/screen/x in client.screen)
|
||||
if( (x.name == "radar" && x.icon == 'radar.dmi') || (x in radar_blips) )
|
||||
client.screen -= x
|
||||
del(x)
|
||||
|
||||
place_radar_closed()
|
||||
|
||||
/mob/living/carbon/human/proc/place_radar_closed()
|
||||
var/obj/screen/closedradar = new()
|
||||
closedradar.icon = 'radar.dmi'
|
||||
closedradar.icon_state = "radarclosed"
|
||||
closedradar.screen_loc = "WEST,NORTH-1"
|
||||
closedradar.name = "radar closed"
|
||||
client.screen += closedradar
|
||||
|
||||
/mob/living/carbon/human/proc/start_radar()
|
||||
|
||||
for(var/obj/screen/x in client.screen)
|
||||
if(x.name == "radar closed" && x.icon == 'radar.dmi')
|
||||
client.screen -= x
|
||||
del(x)
|
||||
|
||||
var/obj/screen/cornerA = new()
|
||||
cornerA.icon = 'radar.dmi'
|
||||
cornerA.icon_state = "radar(1,1)"
|
||||
cornerA.screen_loc = "WEST,NORTH-2"
|
||||
cornerA.name = "radar"
|
||||
|
||||
var/obj/screen/cornerB = new()
|
||||
cornerB.icon = 'radar.dmi'
|
||||
cornerB.icon_state = "radar(2,1)"
|
||||
cornerB.screen_loc = "WEST+1,NORTH-2"
|
||||
cornerB.name = "radar"
|
||||
|
||||
var/obj/screen/cornerC = new()
|
||||
cornerC.icon = 'radar.dmi'
|
||||
cornerC.icon_state = "radar(1,2)"
|
||||
cornerC.screen_loc = "WEST,NORTH-1"
|
||||
cornerC.name = "radar"
|
||||
|
||||
var/obj/screen/cornerD = new()
|
||||
cornerD.icon = 'radar.dmi'
|
||||
cornerD.icon_state = "radar(2,2)"
|
||||
cornerD.screen_loc = "WEST+1,NORTH-1"
|
||||
cornerD.name = "radar"
|
||||
|
||||
client.screen += cornerA
|
||||
client.screen += cornerB
|
||||
client.screen += cornerC
|
||||
client.screen += cornerD
|
||||
|
||||
radar_open = 1
|
||||
|
||||
while(radar_open && (RADAR in augmentations))
|
||||
update_radar()
|
||||
sleep(6)
|
||||
|
||||
/mob/living/carbon/human/proc/update_radar()
|
||||
|
||||
if(!client) return
|
||||
var/list/found_targets = list()
|
||||
|
||||
var/max_dist = 29 // 29 tiles is the max distance
|
||||
|
||||
// If the mob is inside a turf, set the center to the object they're in
|
||||
var/atom/distance_ref = src
|
||||
if(!isturf(src.loc))
|
||||
distance_ref = loc
|
||||
|
||||
// Clear the radar_blips cache
|
||||
for(var/x in radar_blips)
|
||||
client.screen -= x
|
||||
del(x)
|
||||
radar_blips = list()
|
||||
|
||||
var/starting_px = 3
|
||||
var/starting_py = 3
|
||||
|
||||
for(var/mob/living/M in orange(max_dist, distance_ref))
|
||||
if(M.stat == 2) continue
|
||||
found_targets.Add(M)
|
||||
|
||||
for(var/obj/effect/critter/C in orange(max_dist, distance_ref))
|
||||
if(!C.alive) continue
|
||||
found_targets.Add(C)
|
||||
|
||||
for(var/obj/mecha/M in orange(max_dist, distance_ref))
|
||||
if(!M.occupant) continue
|
||||
found_targets.Add(M)
|
||||
|
||||
for(var/obj/structure/closet/C in orange(max_dist, distance_ref))
|
||||
for(var/mob/living/M in C.contents)
|
||||
if(M.stat == 2) continue
|
||||
found_targets.Add(M)
|
||||
|
||||
// Loop through all living mobs in a range.
|
||||
for(var/atom/A in found_targets)
|
||||
|
||||
var/a_x = A.x
|
||||
var/a_y = A.y
|
||||
|
||||
if(!isturf(A.loc))
|
||||
a_x = A.loc.x
|
||||
a_y = A.loc.y
|
||||
|
||||
var/blip_x = max_dist + (-( distance_ref.x-a_x ) ) + starting_px
|
||||
var/blip_y = max_dist + (-( distance_ref.y-a_y ) ) + starting_py
|
||||
var/obj/screen/blip = new()
|
||||
blip.icon = 'radar.dmi'
|
||||
blip.name = "Blip"
|
||||
blip.layer = 21
|
||||
blip.screen_loc = "WEST:[blip_x-1],NORTH-2:[blip_y-1]" // offset -1 because the center of the blip is not at the bottomleft corner (14)
|
||||
|
||||
if(istype(A, /mob/living))
|
||||
var/mob/living/M = A
|
||||
if(ishuman(M))
|
||||
if(M:wear_id)
|
||||
var/job = M:wear_id:GetJobName()
|
||||
if(job == "Security Officer")
|
||||
blip.icon_state = "secblip"
|
||||
blip.name = "Security Officer"
|
||||
else if(job == "Captain" || job == "Research Director" || job == "Chief Engineer" || job == "Chief Medical Officer" || job == "Head of Security" || job == "Head of Personnel")
|
||||
blip.icon_state = "headblip"
|
||||
blip.name = "Station Head"
|
||||
else
|
||||
blip.icon_state = "civblip"
|
||||
blip.name = "Civilian"
|
||||
else
|
||||
blip.icon_state = "civblip"
|
||||
blip.name = "Civilian"
|
||||
|
||||
else if(issilicon(M))
|
||||
blip.icon_state = "roboblip"
|
||||
blip.name = "Robotic Organism"
|
||||
|
||||
else
|
||||
blip.icon_state = "unknownblip"
|
||||
blip.name = "Unknown Organism"
|
||||
|
||||
else if(istype(A, /obj/effect/critter))
|
||||
blip.icon_state = "unknownblip"
|
||||
blip.name = "Unknown Organism"
|
||||
|
||||
else if(istype(A, /obj/mecha))
|
||||
blip.icon_state = "roboblip"
|
||||
blip.name = "Robotic Organism"
|
||||
|
||||
radar_blips.Add(blip)
|
||||
client.screen += blip
|
||||
|
||||
|
||||
|
||||
@@ -147,8 +147,8 @@
|
||||
Metroid.UpdateFeed()
|
||||
return
|
||||
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(prob(40) && !(mutations & FAT))
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(40) && !(FAT in src.mutations))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
return
|
||||
@@ -207,7 +207,7 @@
|
||||
if(shoes)
|
||||
tally += shoes.slowdown
|
||||
|
||||
if(mutations & FAT)
|
||||
if(FAT in src.mutations)
|
||||
tally += 1.5
|
||||
if (bodytemperature < 283.222)
|
||||
tally += (283.222 - bodytemperature) / 10 * 1.75
|
||||
@@ -480,9 +480,10 @@
|
||||
return
|
||||
if (!istype(W, /obj/item))
|
||||
return
|
||||
|
||||
if (!( W.slot_flags & SLOT_OCLOTHING ))
|
||||
return
|
||||
if (mutations & FAT && !(W.flags & ONESIZEFITSALL))
|
||||
if ((FAT in src.mutations) && !(W.flags & ONESIZEFITSALL))
|
||||
src << "\red You're too fat to wear the [W.name]!"
|
||||
return
|
||||
u_equip(W)
|
||||
@@ -575,7 +576,7 @@
|
||||
return
|
||||
if (!( W.slot_flags & SLOT_ICLOTHING ))
|
||||
return
|
||||
if (mutations & FAT && !(W.flags & ONESIZEFITSALL))
|
||||
if ((FAT in src.mutations) && !(W.flags & ONESIZEFITSALL))
|
||||
src << "\red You're too fat to wear the [W.name]!"
|
||||
return
|
||||
u_equip(W)
|
||||
@@ -751,19 +752,19 @@
|
||||
|
||||
// lol
|
||||
var/fat = ""
|
||||
if (mutations & FAT)
|
||||
if (FAT in mutations)
|
||||
fat = "fat"
|
||||
|
||||
if (mutations & HULK)
|
||||
if (HULK in mutations)
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "hulk[fat][!lying ? "_s" : "_l"]")
|
||||
|
||||
if (mutations & COLD_RESISTANCE)
|
||||
if (COLD_RESISTANCE in mutations)
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "fire[fat][!lying ? "_s" : "_l"]")
|
||||
|
||||
if (mutations & TK)
|
||||
if (TK in mutations)
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "telekinesishead[fat][!lying ? "_s" : "_l"]")
|
||||
|
||||
if (mutations & LASER)
|
||||
if (LASER in mutations)
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "lasereyes[!lying ? "_s" : "_l"]")
|
||||
|
||||
if (mutantrace)
|
||||
@@ -839,7 +840,7 @@
|
||||
|
||||
// Uniform
|
||||
if(w_uniform)
|
||||
if (mutations & FAT && !(w_uniform.flags & ONESIZEFITSALL))
|
||||
if ((FAT in src.mutations) && !(w_uniform.flags & ONESIZEFITSALL))
|
||||
src << "\red You burst out of the [w_uniform.name]!"
|
||||
var/obj/item/clothing/c = w_uniform
|
||||
u_equip(c)
|
||||
@@ -855,7 +856,7 @@
|
||||
var/t1 = w_uniform.color
|
||||
if (!t1)
|
||||
t1 = icon_state
|
||||
if (mutations & FAT)
|
||||
if (FAT in src.mutations)
|
||||
overlays += image("icon" = 'uniform_fat.dmi', "icon_state" = "[t1][!lying ? "_s" : "_l"]", "layer" = MOB_LAYER)
|
||||
else
|
||||
overlays += image("icon" = 'uniform.dmi', "icon_state" = text("[][]",t1, (!(lying) ? "_s" : "_l")), "layer" = MOB_LAYER)
|
||||
@@ -933,7 +934,7 @@
|
||||
|
||||
|
||||
if (wear_suit)
|
||||
if (mutations & FAT && !(wear_suit.flags & ONESIZEFITSALL))
|
||||
if ((FAT in src.mutations) && !(wear_suit.flags & ONESIZEFITSALL))
|
||||
src << "\red You burst out of the [wear_suit.name]!"
|
||||
var/obj/item/clothing/c = wear_suit
|
||||
u_equip(c)
|
||||
@@ -1203,8 +1204,8 @@
|
||||
stand_icon = new /icon('human.dmi', "blank")
|
||||
lying_icon = new /icon('human.dmi', "blank")
|
||||
|
||||
var/husk = (mutations & HUSK)
|
||||
var/obese = (mutations & FAT)
|
||||
var/husk = (HUSK in src.mutations)
|
||||
var/obese = (FAT in src.mutations)
|
||||
|
||||
if (husk)
|
||||
stand_icon.Blend(new /icon('human.dmi', "husk_s"), ICON_OVERLAY)
|
||||
@@ -2287,17 +2288,17 @@ It can still be worn/put on as normal.
|
||||
heal_overall_damage(0, -amount)
|
||||
|
||||
/mob/living/carbon/human/Stun(amount)
|
||||
if(mutations & HULK)
|
||||
if(HULK in mutations)
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/Weaken(amount)
|
||||
if(mutations & HULK)
|
||||
if(HULK in mutations)
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/Paralyse(amount)
|
||||
if(mutations & HULK)
|
||||
if(HULK in mutations)
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
@@ -42,7 +42,9 @@
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
if(M.mutations & HULK) damage += 5
|
||||
if(HULK in M.mutations) damage += 5
|
||||
if(SUPRSTR in M.augmentations) damage += 5
|
||||
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
|
||||
visible_message("\red <B>[M] has punched [src]!</B>")
|
||||
@@ -101,6 +103,26 @@
|
||||
return 1
|
||||
|
||||
if("hurt")
|
||||
|
||||
if(ELECTRICHANDS in M.augmentations)
|
||||
var/gendertxt = "their"
|
||||
if(M.gender == "male")
|
||||
gendertxt = "his"
|
||||
if(M.gender == "female")
|
||||
gendertxt = "her"
|
||||
|
||||
visible_message("\red <B>[M] has shocked [src] with [gendertxt] bare hands!</B>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Used Electric Hands nanoaug power on [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been shocked by [M.name] with the Electric Hands nanoaug ([M.ckey])</font>")
|
||||
|
||||
log_attack("<font color='red'>[M.name] ([M.ckey]) used Electric Hands nanoaug on [src.name], shocking them ([src.ckey])</font>")
|
||||
|
||||
|
||||
var/armorblock = run_armor_check(M.zone_sel.selecting, "energy")
|
||||
apply_effects(5,5,0,0,5,0,0,armorblock)
|
||||
|
||||
return
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Punched [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been punched by [M.name] ([M.ckey])</font>")
|
||||
|
||||
@@ -132,7 +154,8 @@
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
|
||||
var/armor_block = run_armor_check(affecting, "melee")
|
||||
|
||||
if(M.mutations & HULK) damage += 5
|
||||
if(HULK in M.mutations) damage += 5
|
||||
if(SUPRSTR in M.augmentations) damage += 5
|
||||
|
||||
switch(attack_verb)
|
||||
if("slash")
|
||||
|
||||
@@ -51,6 +51,9 @@
|
||||
if(blocked)
|
||||
damage = (damage/(blocked+1))
|
||||
|
||||
if(DERMALARMOR in augmentations)
|
||||
damage = damage - (round(damage*0.35)) // reduce damage by 35%
|
||||
|
||||
switch(damagetype)
|
||||
if(BRUTE)
|
||||
organ.take_damage(damage, 0)
|
||||
|
||||
@@ -10,6 +10,12 @@ emp_act
|
||||
|
||||
/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
||||
|
||||
if(REFLEXES in augmentations)
|
||||
if(prob(50))
|
||||
var/message = pick("[src] skillfully dodges the [P.name]!", "[src] ducks, dodging the [P.name]!", "[src] effortlessly jumps out of the way of the [P.name]!", "[src] dodges the [P.name] in one graceful movement!", "[src] leans back, dodging the [P.name] narrowly!")
|
||||
visible_message("\red <B>[message]</B>")
|
||||
return -1
|
||||
|
||||
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor/laserproof))
|
||||
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
|
||||
var/reflectchance = 40 - round(P.damage/3)
|
||||
|
||||
@@ -202,11 +202,37 @@
|
||||
|
||||
handle_mutations_and_radiation()
|
||||
if(getFireLoss())
|
||||
if(mutations & COLD_RESISTANCE || (prob(1) && prob(75)))
|
||||
if((COLD_RESISTANCE in mutations) || (prob(1) && prob(75)))
|
||||
heal_organ_damage(0,1)
|
||||
|
||||
if (mutations & HULK && health <= 25)
|
||||
mutations &= ~HULK
|
||||
// Make nanoregen heal youu, -3 all damage types
|
||||
if(NANOREGEN in augmentations)
|
||||
var/healed = 0
|
||||
if(getToxLoss())
|
||||
adjustToxLoss(-3)
|
||||
healed = 1
|
||||
if(getOxyLoss())
|
||||
adjustOxyLoss(-3)
|
||||
healed = 1
|
||||
if(getCloneLoss())
|
||||
adjustCloneLoss(-3)
|
||||
healed = 1
|
||||
if(getBruteLoss())
|
||||
heal_organ_damage(3,0)
|
||||
healed = 1
|
||||
if(getFireLoss())
|
||||
heal_organ_damage(0,3)
|
||||
healed = 1
|
||||
if(halloss > 0)
|
||||
halloss -= 3
|
||||
if(halloss < 0) halloss = 0
|
||||
healed = 1
|
||||
if(healed)
|
||||
if(prob(5))
|
||||
src << "\blue You feel your wounds mending..."
|
||||
|
||||
if ((HULK in mutations) && health <= 25)
|
||||
mutations.Remove(HULK)
|
||||
src << "\red You suddenly feel very weak."
|
||||
Weaken(3)
|
||||
emote("collapse")
|
||||
@@ -344,7 +370,7 @@
|
||||
*/
|
||||
|
||||
handle_breath(datum/gas_mixture/breath)
|
||||
if(nodamage)
|
||||
if(nodamage || REBREATHER in augmentations)
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles() == 0))
|
||||
@@ -430,7 +456,7 @@
|
||||
spawn(0) emote(pick("giggle", "laugh"))
|
||||
|
||||
|
||||
if(breath.temperature > (T0C+66) && !(mutations & COLD_RESISTANCE)) // Hot air hurts :(
|
||||
if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
|
||||
if(prob(20))
|
||||
src << "\red You feel a searing heat in your lungs!"
|
||||
fire_alert = max(fire_alert, 1)
|
||||
@@ -598,7 +624,7 @@
|
||||
thermal_protection += 3
|
||||
if(head && (head.flags & HEADSPACE))
|
||||
thermal_protection += 1
|
||||
if(mutations & COLD_RESISTANCE)
|
||||
if(COLD_RESISTANCE in mutations)
|
||||
thermal_protection += 5
|
||||
|
||||
return thermal_protection
|
||||
@@ -672,13 +698,13 @@
|
||||
adjustToxLoss(-1)
|
||||
adjustOxyLoss(-1)
|
||||
|
||||
if(overeatduration > 500 && !(mutations & FAT))
|
||||
if(overeatduration > 500 && !(FAT in mutations))
|
||||
src << "\red You suddenly feel blubbery!"
|
||||
mutations |= FAT
|
||||
mutations.Add(FAT)
|
||||
update_body()
|
||||
if ((overeatduration < 100 && mutations & FAT))
|
||||
if ((overeatduration < 100 && (FAT in mutations)))
|
||||
src << "\blue You feel fit again!"
|
||||
mutations &= ~FAT
|
||||
mutations.Remove(FAT)
|
||||
update_body()
|
||||
|
||||
// nutrition decrease
|
||||
@@ -819,7 +845,7 @@
|
||||
if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe
|
||||
del(hud)
|
||||
|
||||
if (stat == 2 || mutations & XRAY)
|
||||
if (stat == 2 || (XRAY in mutations))
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
sight |= SEE_OBJS
|
||||
|
||||
@@ -505,11 +505,21 @@
|
||||
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
|
||||
|
||||
else
|
||||
if(ELECTRICHANDS in M.augmentations)
|
||||
var/gendertxt = "their"
|
||||
if(M.gender == "male")
|
||||
gendertxt = "his"
|
||||
if(M.gender == "female")
|
||||
gendertxt = "her"
|
||||
|
||||
visible_message("\red <B>[M] has shocked [src] with [gendertxt] bare hands!</B>")
|
||||
return
|
||||
|
||||
var/damage = rand(1, 9)
|
||||
|
||||
attacked += 10
|
||||
if (prob(90))
|
||||
if (M.mutations & HULK)
|
||||
if ((HULK in M.mutations) || (SUPRSTR in M.augmentations))
|
||||
damage += 5
|
||||
if(Victim)
|
||||
Victim = null
|
||||
|
||||
@@ -127,15 +127,15 @@
|
||||
handle_mutations_and_radiation()
|
||||
|
||||
if(src.getFireLoss())
|
||||
if(src.mutations & COLD_RESISTANCE || prob(50))
|
||||
if((COLD_RESISTANCE in mutations) || prob(50))
|
||||
switch(src.getFireLoss())
|
||||
if(1 to 50)
|
||||
src.adjustFireLoss(-1)
|
||||
if(51 to 100)
|
||||
src.adjustFireLoss(-5)
|
||||
|
||||
if (src.mutations & HULK && src.health <= 25)
|
||||
src.mutations &= ~HULK
|
||||
if ((HULK in mutations) && src.health <= 25)
|
||||
src.mutations.Remove(HULK)
|
||||
src << "\red You suddenly feel very weak."
|
||||
Weaken(3)
|
||||
emote("collapse")
|
||||
@@ -506,7 +506,7 @@
|
||||
|
||||
handle_regular_hud_updates()
|
||||
|
||||
if (src.stat == 2 || src.mutations & XRAY)
|
||||
if (src.stat == 2 || (XRAY in mutations))
|
||||
src.sight |= SEE_TURFS
|
||||
src.sight |= SEE_MOBS
|
||||
src.sight |= SEE_OBJS
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(istype(tmob, /mob/living/carbon/human) && (HULK in tmob.mutations))
|
||||
if(prob(70))
|
||||
usr << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
@@ -115,7 +115,7 @@
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red <B>[M.name] has bit []!</B>", src), 1)
|
||||
var/damage = rand(1, 5)
|
||||
if (mutations & HULK) damage += 10
|
||||
if (HULK in mutations) damage += 10
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
if(BRUTE)
|
||||
adjustBruteLoss(damage/(blocked+1))
|
||||
if(BURN)
|
||||
if(mutations & COLD_RESISTANCE) damage = 0
|
||||
if(COLD_RESISTANCE in mutations) damage = 0
|
||||
adjustFireLoss(damage/(blocked+1))
|
||||
if(TOX)
|
||||
adjustToxLoss(damage/(blocked+1))
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
/mob/living/proc/burn_skin(burn_amount)
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
//world << "DEBUG: burn_skin(), mutations=[mutations]"
|
||||
if (src.mutations & COLD_RESISTANCE) //fireproof
|
||||
if (COLD_RESISTANCE in src.mutations) //fireproof
|
||||
return 0
|
||||
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
|
||||
var/divided_damage = (burn_amount)/(H.organs.len)
|
||||
@@ -49,7 +49,7 @@
|
||||
H.updatehealth()
|
||||
return 1
|
||||
else if(istype(src, /mob/living/carbon/monkey))
|
||||
if (src.mutations & COLD_RESISTANCE) //fireproof
|
||||
if (COLD_RESISTANCE in src.mutations) //fireproof
|
||||
return 0
|
||||
var/mob/living/carbon/monkey/M = src
|
||||
M.adjustFireLoss(burn_amount)
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
|
||||
handle_regular_hud_updates()
|
||||
|
||||
if (src.stat == 2 || src.mutations & XRAY || src.sight_mode & BORGXRAY)
|
||||
if (src.stat == 2 || XRAY in mutations || src.sight_mode & BORGXRAY)
|
||||
src.sight |= SEE_TURFS
|
||||
src.sight |= SEE_MOBS
|
||||
src.sight |= SEE_OBJS
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(20))
|
||||
usr << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
|
||||
@@ -183,14 +183,11 @@
|
||||
var/datum/dna/dna = null//Carbon
|
||||
var/radiation = 0.0//Carbon
|
||||
|
||||
var/mutations = 0//Carbon
|
||||
//telekinesis = 1
|
||||
//firemut = 2
|
||||
//xray = 4
|
||||
//hulk = 8
|
||||
//clumsy = 16
|
||||
//obese = 32
|
||||
//husk = 64
|
||||
var/list/mutations = list() //Carbon -- Doohl
|
||||
//see: setup.dm for list of mutations
|
||||
|
||||
var/list/augmentations = list() //Carbon -- Doohl
|
||||
//see: setup.dm for list of augmentations
|
||||
|
||||
var/voice_name = "unidentifiable voice"
|
||||
var/voice_message = null // When you are not understood by others (replaced with just screeches, hisses, chimpers etc.)
|
||||
@@ -275,4 +272,6 @@ the mob is also allowed to move without any sort of restriction. For instance, i
|
||||
|
||||
var/geaslist = list()
|
||||
|
||||
var/list/radar_blips = list() // list of screen objects, radar blips
|
||||
var/radar_open = 0 // nonzero is radar is open
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon_state = "grabbed"
|
||||
var/obj/screen/grab/hud1 = null
|
||||
var/mob/affecting = null
|
||||
var/atom/movable/structure = null // if the grab is not grabbing a mob
|
||||
var/mob/assailant = null
|
||||
var/state = 1.0
|
||||
var/killing = 0.0
|
||||
@@ -21,32 +22,52 @@
|
||||
spawn(0)
|
||||
del(src)
|
||||
return grabee
|
||||
|
||||
else if(structure)
|
||||
var/grabee = structure
|
||||
spawn(0)
|
||||
del(src)
|
||||
return grabee
|
||||
|
||||
return null
|
||||
|
||||
|
||||
/obj/item/weapon/grab/proc/synch()
|
||||
if(affecting.anchored)//This will prevent from grabbing people that are anchored.
|
||||
del(src)
|
||||
if (assailant.r_hand == src)
|
||||
hud1.screen_loc = ui_rhand
|
||||
else
|
||||
hud1.screen_loc = ui_lhand
|
||||
if(affecting)
|
||||
if(affecting.anchored)//This will prevent from grabbing people that are anchored.
|
||||
del(src)
|
||||
if (assailant.r_hand == src)
|
||||
hud1.screen_loc = ui_rhand
|
||||
else
|
||||
hud1.screen_loc = ui_lhand
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/grab/process()
|
||||
if(!assailant || !affecting)
|
||||
del(src)
|
||||
return
|
||||
if ((!( isturf(assailant.loc) ) || (!( isturf(affecting.loc) ) || (assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1))))
|
||||
//SN src = null
|
||||
if(!assailant || (!affecting && !structure))
|
||||
del(src)
|
||||
return
|
||||
|
||||
if(affecting && !structure)
|
||||
if ((!( isturf(assailant.loc) ) || (!( isturf(affecting.loc) ) || (assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1))))
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
else if(!affecting && structure)
|
||||
if (!isturf(structure.loc) || !isturf(structure.loc) || (assailant.loc != structure.loc && get_dist(assailant, structure) > 1))
|
||||
del(src)
|
||||
return
|
||||
|
||||
if (assailant.client)
|
||||
assailant.client.screen -= hud1
|
||||
assailant.client.screen += hud1
|
||||
if (assailant.pulling == affecting)
|
||||
if (assailant.pulling == affecting || assailant.pulling == structure)
|
||||
assailant.pulling = null
|
||||
|
||||
if (structure)
|
||||
structure.loc = assailant.loc
|
||||
structure.layer = assailant.layer + 1
|
||||
|
||||
if (state <= 2)
|
||||
allow_upgrade = 1
|
||||
if ((assailant.l_hand && assailant.l_hand != src && istype(assailant.l_hand, /obj/item/weapon/grab)))
|
||||
@@ -111,6 +132,9 @@
|
||||
/obj/item/weapon/grab/proc/s_dbclick(obj/screen/S as obj)
|
||||
//if ((assailant.next_move > world.time && !( last_suffocate < world.time + 2 )))
|
||||
// return
|
||||
|
||||
if (!affecting)
|
||||
return
|
||||
if ((!( assailant.canmove ) || assailant.lying))
|
||||
del(src)
|
||||
return
|
||||
@@ -133,7 +157,7 @@
|
||||
if (state < 3)
|
||||
if(istype(affecting, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = affecting
|
||||
if(H.mutations & FAT)
|
||||
if(FAT in H.mutations)
|
||||
assailant << "\blue You can't strangle [affecting] through all that fat!"
|
||||
return
|
||||
|
||||
@@ -197,6 +221,7 @@
|
||||
|
||||
|
||||
/obj/item/weapon/grab/attack(mob/M as mob, mob/user as mob)
|
||||
if(!affecting) return
|
||||
if (M == affecting)
|
||||
if (state < 3)
|
||||
s_dbclick(hud1)
|
||||
@@ -204,7 +229,7 @@
|
||||
s_click(hud1)
|
||||
return
|
||||
if(M == assailant && state >= 2)
|
||||
if( ( ishuman(user) && (user.mutations & FAT) && ismonkey(affecting) ) || ( isalien(user) && iscarbon(affecting) ) )
|
||||
if( ( ishuman(user) && (FAT in user.mutations) && ismonkey(affecting) ) || ( isalien(user) && iscarbon(affecting) ) )
|
||||
var/mob/living/carbon/attacker = user
|
||||
for(var/mob/N in viewers(user, null))
|
||||
if(N.client)
|
||||
|
||||
@@ -510,6 +510,12 @@
|
||||
usr:inv3.icon_state = "inv3"
|
||||
usr:module_active = null
|
||||
|
||||
if("radar")
|
||||
usr:close_radar()
|
||||
|
||||
if("radar closed")
|
||||
usr:start_radar()
|
||||
|
||||
else
|
||||
DblClick()
|
||||
return
|
||||
@@ -574,7 +580,7 @@
|
||||
if(usr:handcuffed && usr:canmove && (usr.last_special <= world.time))
|
||||
usr.next_move = world.time + 100
|
||||
usr.last_special = world.time + 100
|
||||
if(isalienadult(usr) || usr.mutations & HULK)//Don't want to do a lot of logic gating here.
|
||||
if(isalienadult(usr) || (HULK in usr.mutations) || (SUPRSTR in usr.augmentations))//Don't want to do a lot of logic gating here.
|
||||
usr << "\green You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)"
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] is trying to break the handcuffs!</B>", usr), 1)
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(5))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
@@ -204,7 +204,7 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(50))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
|
||||
@@ -348,7 +348,7 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
if(prob(70))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
|
||||
@@ -58,10 +58,11 @@
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
|
||||
if ((usr.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in usr.mutations) && prob(50))
|
||||
usr << "\red You cut yourself on the paper."
|
||||
return
|
||||
var/n_name = copytext(sanitize(input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text),1,MAX_NAME_LEN)
|
||||
var/n_name = input(usr, "What would you like to label the paper?", "Paper Labelling", null) as text
|
||||
n_name = copytext(n_name, 1, 32)
|
||||
if ((loc == usr && usr.stat == 0))
|
||||
name = "paper[(n_name ? text("- '[n_name]'") : null)]"
|
||||
add_fingerprint(usr)
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
else
|
||||
prot = 1
|
||||
|
||||
if(prot > 0 || (user.mutations & COLD_RESISTANCE))
|
||||
if(prot > 0 || (COLD_RESISTANCE in user.mutations))
|
||||
user << "You remove the light [fitting]"
|
||||
else
|
||||
user << "You try to remove the light [fitting], but you burn your hand on it!"
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
|
||||
if(istype(user, /mob/living))
|
||||
var/mob/living/M = user
|
||||
if ((M.mutations & CLUMSY) && prob(50))
|
||||
if ((CLUMSY in M.mutations) && prob(50))
|
||||
M << "\red The [src.name] blows up in your face."
|
||||
M.take_organ_damage(0,20)
|
||||
M.drop_item()
|
||||
|
||||
@@ -487,7 +487,7 @@
|
||||
AM.loc = src
|
||||
if(istype(AM, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(H.mutations & FAT) // is a human and fat?
|
||||
if(FAT in H.mutations) // is a human and fat?
|
||||
has_fat_guy = 1 // set flag on holder
|
||||
if(istype(AM, /obj/effect/bigDelivery) && !hasmob)
|
||||
var/obj/effect/bigDelivery/T = AM
|
||||
|
||||
104
code/setup.dm
@@ -194,17 +194,79 @@ var/MAX_EXPLOSION_RANGE = 14
|
||||
|
||||
#define FULL_BODY 2047
|
||||
|
||||
/*
|
||||
//bitflags for mutations
|
||||
var/const/TK =(1<<0)
|
||||
var/const/COLD_RESISTANCE =(1<<1)
|
||||
var/const/XRAY =(1<<2)
|
||||
var/const/HULK =(1<<3)
|
||||
var/const/CLUMSY =(1<<4)
|
||||
var/const/FAT =(1<<5)
|
||||
var/const/HUSK =(1<<6)
|
||||
var/const/LASER =(1<<7)
|
||||
var/const/HEAL =(1<<8)
|
||||
var/const/NOCLONE =(1<<9)
|
||||
var/const
|
||||
// Extra powers:
|
||||
SHADOW =(1<<10) // shadow teleportation (create in/out portals anywhere) (25%)
|
||||
SCREAM =(1<<11) // supersonic screaming (25%)
|
||||
EXPLOSIVE =(1<<12) // exploding on-demand (15%)
|
||||
REGENERATION =(1<<13) // superhuman regeneration (30%)
|
||||
REPROCESSOR =(1<<14) // eat anything (50%)
|
||||
SHAPESHIFTING =(1<<15) // take on the appearance of anything (40%)
|
||||
PHASING =(1<<16) // ability to phase through walls (40%)
|
||||
SHIELD =(1<<17) // shielding from all projectile attacks (30%)
|
||||
SHOCKWAVE =(1<<18) // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
|
||||
ELECTRICITY =(1<<19) // ability to shoot electric attacks (15%)
|
||||
|
||||
|
||||
// Nanoaugmentations:
|
||||
SUPRSTR =(1<<20) // super strength
|
||||
RADAR =(1<<21) // on-screen mob radar
|
||||
ELECTRICHANDS =(1<<22) // electric hands
|
||||
ESWORDSYNTH =(1<<23) // esword synthesizer
|
||||
REBREATHER =(1<<24) // removes the need to breathe
|
||||
DERMALARMOR =(1<<25) // 35% damage decrease
|
||||
REFLEXES =(1<<26) // dodge 50% of projectiles, dodge 25% of melee attacks
|
||||
NANOREGEN =(1<<27) // regenerative nanobots, -3 all damage types per second
|
||||
*/
|
||||
|
||||
// String identifiers for associative list lookup
|
||||
|
||||
var/const
|
||||
|
||||
// mob/var/list/mutations
|
||||
|
||||
// Generic mutations:
|
||||
TK =1
|
||||
COLD_RESISTANCE =2
|
||||
XRAY =3
|
||||
HULK =4
|
||||
CLUMSY =5
|
||||
FAT =6
|
||||
HUSK =7
|
||||
NOCLONE =8
|
||||
|
||||
|
||||
// Extra powers:
|
||||
LASER =9 // harm intent - click anywhere to shoot lasers from eyes
|
||||
HEAL =10 // healing people with hands
|
||||
SHADOW =11 // shadow teleportation (create in/out portals anywhere) (25%)
|
||||
SCREAM =12 // supersonic screaming (25%)
|
||||
EXPLOSIVE =13 // exploding on-demand (15%)
|
||||
REGENERATION =14 // superhuman regeneration (30%)
|
||||
REPROCESSOR =15 // eat anything (50%)
|
||||
SHAPESHIFTING =16 // take on the appearance of anything (40%)
|
||||
PHASING =17 // ability to phase through walls (40%)
|
||||
SHIELD =18 // shielding from all projectile attacks (30%)
|
||||
SHOCKWAVE =19 // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
|
||||
ELECTRICITY =20 // ability to shoot electric attacks (15%)
|
||||
|
||||
|
||||
// mob/var/list/augmentations
|
||||
|
||||
// Nanoaugmentations:
|
||||
SUPRSTR =21 // super strength (hulk powers)
|
||||
RADAR =22 // on-screen mob radar
|
||||
ELECTRICHANDS =23 // electric hands
|
||||
ESWORDSYNTH =24 // esword synthesizer
|
||||
REBREATHER =25 // removes the need to breathe
|
||||
DERMALARMOR =26 // 35% damage decrease
|
||||
REFLEXES =27 // dodge 50% of projectiles
|
||||
NANOREGEN =28 // regenerative nanobots, -3 all damage types per second
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//mob/var/stat things
|
||||
@@ -285,3 +347,25 @@ var/static/list/scarySounds = list('thudswoosh.ogg','Taser.ogg','armbomb.ogg','h
|
||||
#define SEC_LEVEL_DELTA 3
|
||||
|
||||
#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
|
||||
|
||||
var/list/liftable_structures = list(\
|
||||
|
||||
/obj/machinery/autolathe, \
|
||||
/obj/machinery/constructable_frame, \
|
||||
/obj/machinery/hydroponics, \
|
||||
/obj/machinery/computer, \
|
||||
/obj/machinery/optable, \
|
||||
/obj/machinery/dispenser, \
|
||||
/obj/machinery/gibber, \
|
||||
/obj/machinery/microwave, \
|
||||
/obj/machinery/vending, \
|
||||
/obj/machinery/seed_extractor, \
|
||||
/obj/machinery/space_heater, \
|
||||
/obj/machinery/recharge_station, \
|
||||
/obj/machinery/flasher, \
|
||||
/obj/structure/stool, \
|
||||
/obj/structure/closet, \
|
||||
/obj/machinery/photocopier, \
|
||||
/obj/structure/filingcabinet, \
|
||||
/obj/structure/reagent_dispensers, \
|
||||
/obj/machinery/portable_atmospherics/canister)
|
||||
|
||||
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 42 KiB |
BIN
icons/misc/radar.dmi
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |