Merge remote-tracking branch 'origin/master' into bay_examine

# Conflicts:
#	code/game/objects/structures/displaycase.dm
This commit is contained in:
Tigercat2000
2015-09-15 14:08:36 -07:00
208 changed files with 2587 additions and 3346 deletions
+11 -7
View File
@@ -42,13 +42,17 @@
#define NO_PAIN 32
#define REQUIRE_LIGHT 64
#define IS_WHITELISTED 128
#define HAS_LIPS 512
#define HAS_UNDERWEAR 1024
#define IS_PLANT 2048
#define CAN_BE_FAT 4096
#define IS_RESTRICTED 8192
#define NO_INTORGANS 16384
#define NO_POISON 32768
#define HAS_LIPS 256
#define IS_PLANT 512
#define CAN_BE_FAT 1024
#define IS_RESTRICTED 2048
#define NO_INTORGANS 4096
#define NO_POISON 8192
//Species clothing flags
#define HAS_UNDERWEAR 1
#define HAS_UNDERSHIRT 2
#define HAS_SOCKS 4
//Species Blood Flags
#define BLOOD_SLIME 1
+36
View File
@@ -1,3 +1,4 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/*
@@ -1765,3 +1766,38 @@ var/mob/dview/dview_mob = new
if(orbiting)
loc = get_turf(orbiting)
orbiting = null
//Centers an image.
//Requires:
//The Image
//The x dimension of the icon file used in the image
//The y dimension of the icon file used in the image
// eg: center_image(I, 32,32)
// eg2: center_image(I, 96,96)
/proc/center_image(var/image/I, x_dimension = 0, y_dimension = 0)
if(!I)
return
if(!x_dimension || !y_dimension)
return
//Get out of here, punk ass kids calling procs needlessly
if((x_dimension == world.icon_size) && (y_dimension == world.icon_size))
return I
//Offset the image so that it's bottom left corner is shifted this many pixels
//This makes it infinitely easier to draw larger inhands/images larger than world.iconsize
//but still use them in game
var/x_offset = -((x_dimension/world.icon_size)-1)*(world.icon_size*0.5)
var/y_offset = -((y_dimension/world.icon_size)-1)*(world.icon_size*0.5)
//Correct values under world.icon_size
if(x_dimension < world.icon_size)
x_offset *= -1
if(y_dimension < world.icon_size)
y_offset *= -1
I.pixel_x = x_offset
I.pixel_y = y_offset
return I
+2 -1
View File
@@ -1,6 +1,7 @@
// We manually initialize the alarm handlers instead of looping over all existing types
// to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof.
/var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new()
/var/global/datum/alarm_handler/burglar/burglar_alarm = new()
/var/global/datum/alarm_handler/camera/camera_alarm = new()
/var/global/datum/alarm_handler/fire/fire_alarm = new()
/var/global/datum/alarm_handler/motion/motion_alarm = new()
@@ -15,7 +16,7 @@ var/datum/controller/process/alarm/alarm_manager
/datum/controller/process/alarm/setup()
name = "alarm"
schedule_interval = 20 // every 2 seconds
all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
alarm_manager = src
/datum/controller/process/alarm/doWork()
+7
View File
@@ -92,3 +92,10 @@
* Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle
*/
/hook/sell_crate
/**
* Captain spawned hook.
* Called in supervisor.dm when a captain spawns
* Parameters: var/mob/living/carbon/human/captain
*/
/hook/captain_spawned
-1
View File
@@ -520,7 +520,6 @@
throwforce = 20
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
icon = 'icons/obj/weapons.dmi'
icon_override = 'icons/mob/in-hand/staff.dmi'
icon_state = "bostaff0"
+14 -15
View File
@@ -217,7 +217,6 @@ var/list/uplink_items = list()
cost = 12
job = list("Research Director")
//Stimulants
/datum/uplink_item/jobspecific/stims
@@ -245,14 +244,14 @@ var/list/uplink_items = list()
/datum/uplink_item/dangerous/pistol
name = "Syndicate Pistol"
name = "FK-69 Pistol"
reference = "SPI"
desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible with suppressors."
item = /obj/item/weapon/gun/projectile/automatic/pistol
cost = 9
/datum/uplink_item/dangerous/revolver
name = "Syndicate Revolver"
name = "Syndicate .357 Revolver"
reference = "SR"
desc = "A brutally simple syndicate revolver that fires .357 Magnum cartridges and has 7 chambers."
item = /obj/item/weapon/gun/projectile/revolver
@@ -260,7 +259,7 @@ var/list/uplink_items = list()
surplus = 50
/datum/uplink_item/dangerous/smg
name = "Syndicate SMG"
name = "C-20r Submachine Gun"
reference = "SMG"
desc = "A fully-loaded Scarborough Arms bullpup submachine gun that fires .45 rounds with a 20-round magazine and is compatible with suppressors."
item = /obj/item/weapon/gun/projectile/automatic/c20r
@@ -268,17 +267,17 @@ var/list/uplink_items = list()
gamemodes = list("nuclear emergency")
surplus = 40
/datum/uplink_item/dangerous/car
name = "C-90gl Compact Assault Rifle"
desc = "A fully-loaded Zashchita Industriya toploading bullpup assault rifle that uses 30-round 5.45x39mm magazines with a toggleable underslung 40mm grenade launcher."
/datum/uplink_item/dangerous/carbine
name = "M-90gl Carbine"
desc = "A fully-loaded three-round burst carbine that uses 30-round 5.56mm magazines with a togglable underslung 40mm grenade launcher."
reference = "AR"
item = /obj/item/weapon/gun/projectile/automatic/c90gl
item = /obj/item/weapon/gun/projectile/automatic/m90
cost = 18
gamemodes = list("nuclear emergency")
surplus = 50
/datum/uplink_item/dangerous/machinegun
name = "Syndicate LMG"
name = "L6 Squad Automatic Weapon"
desc = "A fully-loaded Aussec Armoury belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition."
reference = "LMG"
item = /obj/item/weapon/gun/projectile/automatic/l6_saw
@@ -399,7 +398,7 @@ var/list/uplink_items = list()
surplus = 40
/datum/uplink_item/ammo/pistol
name = "Ammo-10mm"
name = "Magazine - 10mm"
desc = "An additional 8-round 10mm magazine for use in the syndicate pistol. These subsonic rounds are dirt cheap but are half as effective as .357 rounds."
reference = "10MM"
item = /obj/item/ammo_box/magazine/m10mm
@@ -460,11 +459,11 @@ var/list/uplink_items = list()
cost = 2
gamemodes = list("nuclear emergency")
/datum/uplink_item/ammo/car
name = "Box Magazine - 5.45x39mm"
desc = "An additional 30-round 5.45x39mm magazine for use in the C-90gl assault rifle. These bullets don't have the punch to knock most targets down, but dish out higher overall damage."
reference = "545"
item = /obj/item/ammo_box/magazine/m545
/datum/uplink_item/ammo/carbine
name = "Toploader Magazine - 5.56"
desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage."
reference = "556"
item = /obj/item/ammo_box/magazine/m556
cost = 2
gamemodes = list("nuclear emergency")
+25
View File
@@ -108,6 +108,31 @@
updateicon()
mouse_opacity = 0
air_doors_open()
return
/area/proc/burglaralert(var/obj/trigger)
if(always_unpowered == 1) //no burglar alarms in space/asteroid
return
//Trigger alarm effect
set_fire_alarm_effect()
//Lockdown airlocks
for(var/obj/machinery/door/airlock/A in src)
spawn(0)
A.close()
if(A.density)
A.lock()
burglar_alarm.triggerAlarm(src, trigger)
spawn(600)
burglar_alarm.clearAlarm(src, trigger)
/area/proc/set_fire_alarm_effect()
fire = 1
updateicon()
mouse_opacity = 0
/area/proc/readyalert()
if(!eject)
+8 -1
View File
@@ -12,6 +12,7 @@
var/throwpass = 0
var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom.
var/simulated = 1 //filter for actions - used by lighting overlays
var/atom_say_verb = "says"
///Chemistry.
var/datum/reagents/reagents = null
@@ -346,7 +347,7 @@ its easier to just keep the beam vertical.
fingerprints = list()
//Hash this shit.
var/full_print = md5(H.dna.uni_identity)
var/full_print = H.get_full_print()
// Add the fingerprints
fingerprints[full_print] = full_print
@@ -455,3 +456,9 @@ its easier to just keep the beam vertical.
/atom/proc/narsie_act()
return
/atom/proc/atom_say(var/message)
if((!message))
return
for(var/mob/O in hearers(src, null))
O.show_message("<span class='game say'><span class='name'>[src]</span> [atom_say_verb], \"[message]\"</span>",2)
-128
View File
@@ -1,128 +0,0 @@
/////////////////////////// DNA DATUM
/datum/dna
var/unique_enzymes = null
var/struc_enzymes = null
var/uni_identity = null
var/b_type = "A+"
var/mutantrace = null //The type of mutant race the player is if applicable (i.e. potato-man)
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character)
if(character)
if(length(uni_identity) != 39)
//Lazy.
var/temp
//Hair
var/hair = 0
if(!character.h_style)
character.h_style = "Skinhead"
var/hrange = round(4095 / hair_styles_list.len)
var/index = hair_styles_list.Find(character.h_style)
if(index)
hair = index * hrange - rand(1,hrange-1)
//Facial Hair
var/beard = 0
if(!character.f_style)
character.f_style = "Shaved"
var/f_hrange = round(4095 / facial_hair_styles_list.len)
index = facial_hair_styles_list.Find(character.f_style)
if(index)
beard = index * f_hrange - rand(1,f_hrange-1)
temp = add_zero2(num2hex((character.r_hair),1), 3)
temp += add_zero2(num2hex((character.b_hair),1), 3)
temp += add_zero2(num2hex((character.g_hair),1), 3)
temp += add_zero2(num2hex((character.r_facial),1), 3)
temp += add_zero2(num2hex((character.b_facial),1), 3)
temp += add_zero2(num2hex((character.g_facial),1), 3)
temp += add_zero2(num2hex(((character.s_tone + 220) * 16),1), 3)
temp += add_zero2(num2hex((character.r_eyes),1), 3)
temp += add_zero2(num2hex((character.g_eyes),1), 3)
temp += add_zero2(num2hex((character.b_eyes),1), 3)
var/gender
if (character.gender == MALE)
gender = add_zero2(num2hex((rand(1,(2050+BLOCKADD))),1), 3)
else
gender = add_zero2(num2hex((rand((2051+BLOCKADD),4094)),1), 3)
temp += gender
temp += add_zero2(num2hex((beard),1), 3)
temp += add_zero2(num2hex((hair),1), 3)
uni_identity = temp
if(length(struc_enzymes)!= 3*STRUCDNASIZE)
var/mutstring = ""
for(var/i = 1, i <= STRUCDNASIZE, i++)
mutstring += add_zero2(num2hex(rand(1,1024)),3)
struc_enzymes = mutstring
if(length(unique_enzymes) != 32)
unique_enzymes = md5(character.real_name)
else
if(length(uni_identity) != 39) uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4"
if(length(struc_enzymes)!= 3*STRUCDNASIZE) struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
/datum/dna/proc/ready_dna(mob/living/carbon/human/character)
var/temp
//Hair
var/hair = 0
if(!character.h_style)
character.h_style = random_hair_style(character.gender)
var/hrange = round(4095 / hair_styles_list.len)
var/index = hair_styles_list.Find(character.h_style)
if(index)
hair = index * hrange - rand(1,hrange-1)
//Facial Hair
var/beard = 0
if(!character.f_style)
character.f_style = random_facial_hair_style(character.gender)
var/f_hrange = round(4095 / facial_hair_styles_list.len)
index = facial_hair_styles_list.Find(character.f_style)
if(index)
beard = index * f_hrange - rand(1,f_hrange-1)
temp = add_zero2(num2hex((character.r_hair),1), 3)
temp += add_zero2(num2hex((character.b_hair),1), 3)
temp += add_zero2(num2hex((character.g_hair),1), 3)
temp += add_zero2(num2hex((character.r_facial),1), 3)
temp += add_zero2(num2hex((character.b_facial),1), 3)
temp += add_zero2(num2hex((character.g_facial),1), 3)
temp += add_zero2(num2hex(((character.s_tone + 220) * 16),1), 3)
temp += add_zero2(num2hex((character.r_eyes),1), 3)
temp += add_zero2(num2hex((character.g_eyes),1), 3)
temp += add_zero2(num2hex((character.b_eyes),1), 3)
var/gender
if (character.gender == MALE)
gender = add_zero2(num2hex((rand(1,(2050+BLOCKADD))),1), 3)
else
gender = add_zero2(num2hex((rand((2051+BLOCKADD),4094)),1), 3)
temp += gender
temp += add_zero2(num2hex((beard),1), 3)
temp += add_zero2(num2hex((hair),1), 3)
uni_identity = temp
var/mutstring = ""
for(var/i = 1, i <= STRUCDNASIZE, i++)
mutstring += add_zero2(num2hex(rand(1,1024)),3)
struc_enzymes = mutstring
unique_enzymes = md5(character.real_name)
reg_dna[unique_enzymes] = character.real_name
/////////////////////////// DNA DATUM
-575
View File
@@ -1,575 +0,0 @@
/////////////////////////// DNA HELPER-PROCS
/proc/getleftblocks(input,blocknumber,blocksize)
var/string
if (blocknumber > 1)
string = copytext(input,1,((blocksize*blocknumber)-(blocksize-1)))
return string
else
return null
/proc/getrightblocks(input,blocknumber,blocksize)
var/string
if (blocknumber < (length(input)/blocksize))
string = copytext(input,blocksize*blocknumber+1,length(input)+1)
return string
else
return null
/proc/getblockstring(input,block,subblock,blocksize,src,ui) // src is probably used here just for urls; ui is 1 when requesting for the unique identifier screen, 0 for structural enzymes screen
var/string
var/subpos = 1 // keeps track of the current sub block
var/blockpos = 1 // keeps track of the current block
for(var/i = 1, i <= length(input), i++) // loop through each letter
var/pushstring
if(subpos == subblock && blockpos == block) // if the current block/subblock is selected, mark it
pushstring = "</font color><b>[copytext(input, i, i+1)]</b><font color='blue'>"
else
if(ui) //This is for allowing block clicks to be differentiated
pushstring = "<a href='?src=\ref[src];uimenuset=[num2text(blockpos)];uimenusubset=[num2text(subpos)]'>[copytext(input, i, i+1)]</a>"
else
pushstring = "<a href='?src=\ref[src];semenuset=[num2text(blockpos)];semenusubset=[num2text(subpos)]'>[copytext(input, i, i+1)]</a>"
string += pushstring // push the string to the return string
if(subpos >= blocksize) // add a line break for every block
string += " </font color><font color='#285B5B'>|</font color><font color='blue'> "
subpos = 0
blockpos++
subpos++
return string
/proc/getblock(input,blocknumber,blocksize)
var/result
result = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1)
return result
/proc/getblockbuffer(input,blocknumber,blocksize)
var/result[3]
var/block = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1)
for(var/i = 1, i <= 3, i++)
result[i] = copytext(block, i, i+1)
return result
/proc/setblock(istring, blocknumber, replacement, blocksize)
if(!blocknumber)
return istring
if(!istring || !replacement || !blocksize) return 0
var/result = getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize)
return result
/proc/add_zero2(t, u)
var/temp1
while (length(t) < u)
t = "0[t]"
temp1 = t
if (length(t) > u)
temp1 = copytext(t,2,u+1)
return temp1
/proc/miniscramble(input,rs,rd)
var/output
output = null
if (input == "C" || input == "D" || input == "E" || input == "F")
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"6",prob((rs*10));"7",prob((rs*5)+(rd));"0",prob((rs*5)+(rd));"1",prob((rs*10)-(rd));"2",prob((rs*10)-(rd));"3")
if (input == "8" || input == "9" || input == "A" || input == "B")
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3")
if (input == "4" || input == "5" || input == "6" || input == "7")
output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3")
if (input == "0" || input == "1" || input == "2" || input == "3")
output = pick(prob((rs*10));"8",prob((rs*10));"9",prob((rs*10));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C",prob((rs*10)-(rd));"D",prob((rs*5)+(rd));"E",prob((rs*5)+(rd));"F")
if (!output) output = "5"
return output
//Instead of picking a value far from the input, this will pick values closer to it.
//Sorry for the block of code, but it's more efficient then calling text2hex -> loop -> hex2text
/proc/miniscrambletarget(input,rs,rd)
var/output = null
switch(input)
if("0")
output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10));"2",prob((rs*10)-(rd));"3")
if("1")
output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10));"3",prob((rs*10)-(rd));"4")
if("2")
output = pick(prob((rs*10));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10));"4",prob((rs*10)-(rd));"5")
if("3")
output = pick(prob((rs*10)-(rd));"0",prob((rs*10));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10));"5",prob((rs*10)-(rd));"6")
if("4")
output = pick(prob((rs*10)-(rd));"1",prob((rs*10));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10));"6",prob((rs*10)-(rd));"7")
if("5")
output = pick(prob((rs*10)-(rd));"2",prob((rs*10));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10));"7",prob((rs*10)-(rd));"8")
if("6")
output = pick(prob((rs*10)-(rd));"3",prob((rs*10));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10));"8",prob((rs*10)-(rd));"9")
if("7")
output = pick(prob((rs*10)-(rd));"4",prob((rs*10));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10));"9",prob((rs*10)-(rd));"A")
if("8")
output = pick(prob((rs*10)-(rd));"5",prob((rs*10));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10));"A",prob((rs*10)-(rd));"B")
if("9")
output = pick(prob((rs*10)-(rd));"6",prob((rs*10));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C")
if("10")//A
output = pick(prob((rs*10)-(rd));"7",prob((rs*10));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10));"C",prob((rs*10)-(rd));"D")
if("11")//B
output = pick(prob((rs*10)-(rd));"8",prob((rs*10));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10));"D",prob((rs*10)-(rd));"E")
if("12")//C
output = pick(prob((rs*10)-(rd));"9",prob((rs*10));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10));"E",prob((rs*10)-(rd));"F")
if("13")//D
output = pick(prob((rs*10)-(rd));"A",prob((rs*10));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10));"F")
if("14")//E
output = pick(prob((rs*10)-(rd));"B",prob((rs*10));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F")
if("15")//F
output = pick(prob((rs*10)-(rd));"C",prob((rs*10));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F")
if(!input || !output) //How did this happen?
output = "8"
return output
/proc/isblockon(hnumber, bnumber , var/UI = 0)
var/temp2
temp2 = hex2num(hnumber)
if(UI)
if(temp2 >= 2050)
return 1
else
return 0
if (bnumber == HULKBLOCK || bnumber == TELEBLOCK || bnumber == NOBREATHBLOCK || bnumber == NOPRINTSBLOCK || bnumber == SMALLSIZEBLOCK || bnumber == SHOCKIMMUNITYBLOCK)
if (temp2 >= 3500 + BLOCKADD)
return 1
else
return 0
if (bnumber == XRAYBLOCK || bnumber == FIREBLOCK || bnumber == REMOTEVIEWBLOCK || bnumber == REGENERATEBLOCK || bnumber == INCREASERUNBLOCK || bnumber == REMOTETALKBLOCK || bnumber == MORPHBLOCK)
if (temp2 >= 3050 + BLOCKADD)
return 1
else
return 0
if (temp2 >= 2050 + BLOCKADD)
return 1
else
return 0
/proc/ismuton(var/block,var/mob/M)
return isblockon(getblock(M.dna.struc_enzymes, block,3),block)
/proc/randmutb(mob/M as mob)
if(!M) return
var/num
var/newdna
num = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK)
M.dna.check_integrity()
newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3)
M.dna.struc_enzymes = newdna
return
/proc/randmutg(mob/M as mob)
if(!M) return
var/num
var/newdna
num = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK)
M.dna.check_integrity()
newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3)
M.dna.struc_enzymes = newdna
return
/proc/scramble(var/type, mob/M as mob, var/p)
if(!M) return
M.dna.check_integrity()
if(type)
for(var/i = 1, i <= STRUCDNASIZE-1, i++)
if(prob(p))
M.dna.uni_identity = setblock(M.dna.uni_identity, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3)
updateappearance(M, M.dna.uni_identity)
else
for(var/i = 1, i <= STRUCDNASIZE-1, i++)
if(prob(p))
M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3)
domutcheck(M, null)
return
/proc/randmuti(mob/M as mob)
if(!M) return
var/num
var/newdna
num = rand(1,UNIDNASIZE)
M.dna.check_integrity()
newdna = setblock(M.dna.uni_identity,num,add_zero2(num2hex(rand(1,4095),1),3),3)
M.dna.uni_identity = newdna
return
/proc/toggledblock(hnumber) //unused
var/temp3
var/chtemp
temp3 = hex2num(hnumber)
if (temp3 < 2050)
chtemp = rand(2050,4095)
return add_zero2(num2hex(chtemp,1),3)
else
chtemp = rand(1,2049)
return add_zero2(num2hex(chtemp,1),3)
/////////////////////////// DNA HELPER-PROCS
/////////////////////////// DNA MISC-PROCS
/proc/updateappearance(mob/M as mob , structure)
if(istype(M, /mob/living/carbon/human))
M.dna.check_integrity()
var/mob/living/carbon/human/H = M
H.r_hair = hex2num(getblock(structure,1,3))
H.b_hair = hex2num(getblock(structure,2,3))
H.g_hair = hex2num(getblock(structure,3,3))
H.r_facial = hex2num(getblock(structure,4,3))
H.b_facial = hex2num(getblock(structure,5,3))
H.g_facial = hex2num(getblock(structure,6,3))
H.s_tone = round(((hex2num(getblock(structure,7,3)) / 16) - 220))
H.r_eyes = hex2num(getblock(structure,8,3))
H.g_eyes = hex2num(getblock(structure,9,3))
H.b_eyes = hex2num(getblock(structure,10,3))
if(H.internal_organs_by_name["eyes"])
H.update_eyes()
if (isblockon(getblock(structure, 11,3),11 , 1))
H.gender = FEMALE
else
H.gender = MALE
//Hair
var/hairnum = hex2num(getblock(structure,13,3))
var/index = round(1 +(hairnum / 4096)*hair_styles_list.len)
if((0 < index) && (index <= hair_styles_list.len))
H.h_style = hair_styles_list[index]
//Facial Hair
var/beardnum = hex2num(getblock(structure,12,3))
index = round(1 +(beardnum / 4096)*facial_hair_styles_list.len)
if((0 < index) && (index <= facial_hair_styles_list.len))
H.f_style = facial_hair_styles_list[index]
H.update_body(0)
H.update_hair()
return 1
else
return 0
/proc/probinj(var/pr, var/inj)
return prob(pr+inj*pr)
/proc/domutcheck(mob/living/M as mob, connected, inj)
if (!M) return
M.dna.check_integrity()
M.disabilities = 0
M.sdisabilities = 0
var/old_mutations = M.mutations
M.mutations = list()
M.pass_flags = 0
// M.see_in_dark = 2
// M.see_invisible = 0
if(PLANT in old_mutations)
M.mutations.Add(PLANT)
if(SKELETON in old_mutations)
M.mutations.Add(SKELETON)
if(FAT in old_mutations)
M.mutations.Add(FAT)
if(HUSK in old_mutations)
M.mutations.Add(HUSK)
if(ismuton(NOBREATHBLOCK,M))
if(probinj(45,inj) || (mNobreath in old_mutations))
M << "\blue You feel no need to breathe."
M.mutations.Add(mNobreath)
if(ismuton(REMOTEVIEWBLOCK,M))
if(probinj(45,inj) || (mRemote in old_mutations))
M << "\blue Your mind expands"
M.mutations.Add(mRemote)
M.verbs += /mob/living/carbon/human/proc/remoteobserve
if(ismuton(REGENERATEBLOCK,M))
if(probinj(45,inj) || (mRegen in old_mutations))
M << "\blue Your body pulses with energy"
M.mutations.Add(mRegen)
if(ismuton(INCREASERUNBLOCK,M))
if(probinj(45,inj) || (mRun in old_mutations))
M << "\blue You feel quick"
M.mutations.Add(mRun)
if(ismuton(REMOTETALKBLOCK,M))
if(probinj(45,inj) || (mRemotetalk in old_mutations))
M << "\blue You expand your mind outwards"
M.mutations.Add(mRemotetalk)
M.verbs += /mob/living/carbon/human/proc/remotesay
if(ismuton(MORPHBLOCK,M))
if(probinj(45,inj) || (mMorph in old_mutations))
M.mutations.Add(mMorph)
M << "\blue Your skin feels strange"
M.verbs += /mob/living/carbon/human/proc/morph
if(ismuton(BLENDBLOCK,M))
if(probinj(45,inj) || (mBlend in old_mutations))
M.mutations.Add(mBlend)
M << "\blue You feel alone"
if(ismuton(HALLUCINATIONBLOCK,M))
if(probinj(45,inj) || (mHallucination in old_mutations))
M.mutations.Add(mHallucination)
M << "\red Your mind says 'Hello'"
if(ismuton(NOPRINTSBLOCK,M))
if(probinj(45,inj) || (mFingerprints in old_mutations))
M.mutations.Add(mFingerprints)
M << "\blue Your fingers feel numb"
if(ismuton(SHOCKIMMUNITYBLOCK,M))
if(probinj(45,inj) || (mShock in old_mutations))
M.mutations.Add(mShock)
M << "\blue Your skin feels dry"
if(ismuton(SMALLSIZEBLOCK,M))
if(probinj(45,inj) || (mSmallsize in old_mutations))
M << "\blue Your skin feels rubbery"
M.mutations.Add(mSmallsize)
M.pass_flags |= 1
if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),HULKBLOCK))
if(probinj(5,inj) || (HULK in old_mutations))
M << "\blue Your muscles hurt."
M.mutations.Add(HULK)
if (isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK))
M.disabilities |= EPILEPSY
M << "\red You get a headache."
if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),FAKEBLOCK))
M << "\red You feel strange."
if (prob(95))
if(prob(50))
randmutb(M)
else
randmuti(M)
else
randmutg(M)
if (isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK))
M.disabilities |= COUGHING
M << "\red You start coughing."
if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK))
M << "\red You feel lightheaded."
M.mutations.Add(CLUMSY)
if (isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK))
M.disabilities |= TOURETTES
M << "\red You twitch."
if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK))
if(probinj(30,inj) || (XRAY in old_mutations))
M << "\blue The walls suddenly disappear."
// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
// M.see_in_dark = 8
// M.see_invisible = 2
M.mutations.Add(XRAY)
if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK))
M.disabilities |= NERVOUS
M << "\red You feel nervous."
if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),FIREBLOCK))
if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations))
M << "\blue Your body feels warm."
M.mutations.Add(COLD_RESISTANCE)
if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK))
M.sdisabilities |= BLIND
M << "\red You can't seem to see anything."
if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),TELEBLOCK))
if(probinj(15,inj) || (TK in old_mutations))
M << "\blue You feel smarter."
M.mutations.Add(TK)
if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK))
M.sdisabilities |= DEAF
M.ear_deaf = 1
M << "\red Its kinda quiet.."
if (isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK))
M.disabilities |= NEARSIGHTED
M << "Your eyes feel weird..."
/* If you want the new mutations to work, UNCOMMENT THIS.
if(istype(M, /mob/living/carbon))
for (var/datum/mutations/mut in global_mutations)
mut.check_mutation(M)
*/
//////////////////////////////////////////////////////////// Monkey Block
if (isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && istype(M, /mob/living/carbon/human))
// human > monkey
var/mob/living/carbon/human/H = M
H.notransform = 1
var/list/implants = list() //Try to preserve implants.
for(var/obj/item/weapon/implant/W in H)
implants += W
W.loc = null
if(!connected)
for(var/obj/item/W in (H.contents-implants))
if (W==H.w_uniform) // will be teared
continue
H.unEquip(W)
M.notransform = 1
M.canmove = 0
M.icon = null
M.invisibility = 101
var/atom/movable/overlay/animation = new( M.loc )
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("h2monkey", animation)
sleep(48)
del(animation)
var/mob/living/carbon/monkey/O = null
if(H.species.primitive)
O = new H.species.primitive(src)
else
H.gib() //Trying to change the species of a creature with no primitive var set is messy.
return
if(M)
if (M.dna)
O.dna = M.dna
M.dna = null
if (M.suiciding)
O.suiciding = M.suiciding
M.suiciding = null
for(var/datum/disease/D in M.viruses)
O.viruses += D
D.affected_mob = O
M.viruses -= D
for(var/obj/T in (M.contents-implants))
del(T)
O.loc = M.loc
if(M.mind)
M.mind.transfer_to(O) //transfer our mind to the cute little monkey
if (connected) //inside dna thing
var/obj/machinery/dna_scannernew/C = connected
O.loc = C
C.occupant = O
connected = null
O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6))
O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss())
O.adjustToxLoss(M.getToxLoss() + 20)
O.adjustOxyLoss(M.getOxyLoss())
O.stat = M.stat
O.a_intent = I_HARM
for (var/obj/item/weapon/implant/I in implants)
I.loc = O
I.implanted = O
// O.update_icon = 1 //queue a full icon update at next life() call
del(M)
return
if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human))
// monkey > human,
var/mob/living/carbon/monkey/Mo = M
Mo.notransform = 1
var/list/implants = list() //Still preserving implants
for(var/obj/item/weapon/implant/W in Mo)
implants += W
W.loc = null
if(!connected)
for(var/obj/item/W in (Mo.contents-implants))
Mo.unEquip(W)
M.notransform = 1
M.canmove = 0
M.icon = null
M.invisibility = 101
var/atom/movable/overlay/animation = new( M.loc )
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("monkey2h", animation)
sleep(48)
del(animation)
var/mob/living/carbon/human/human/O = new( src )
if(Mo.greaterform)
O.set_species(Mo.greaterform)
if (isblockon(getblock(M.dna.uni_identity, 11,3),11))
O.gender = FEMALE
else
O.gender = MALE
if (M)
if (M.dna)
O.dna = M.dna
M.dna = null
if (M.suiciding)
O.suiciding = M.suiciding
M.suiciding = null
for(var/datum/disease/D in M.viruses)
O.viruses += D
D.affected_mob = O
M.viruses -= D
//for(var/obj/T in M)
// del(T)
O.loc = M.loc
if(M.mind)
M.mind.transfer_to(O) //transfer our mind to the human
if (connected) //inside dna thing
var/obj/machinery/dna_scannernew/C = connected
O.loc = C
C.occupant = O
connected = null
var/i
while (!i)
var/randomname
if (O.gender == MALE)
randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names)))
else
randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names)))
if (findname(randomname))
continue
else
O.real_name = randomname
i++
updateappearance(O,O.dna.uni_identity)
O.take_overall_damage(M.getBruteLoss(), M.getFireLoss())
O.adjustToxLoss(M.getToxLoss())
O.adjustOxyLoss(M.getOxyLoss())
O.stat = M.stat
for (var/obj/item/weapon/implant/I in implants)
I.loc = O
I.implanted = O
// O.update_icon = 1 //queue a full icon update at next life() call
del(M)
return
//////////////////////////////////////////////////////////// Monkey Block
if(M)
M.update_icon = 1 //queue a full icon update at next life() call
return null
/proc/togglemut(mob/M as mob, var/block)
if(!M) return
var/newdna
M.dna.check_integrity()
newdna = setblock(M.dna.struc_enzymes,block,toggledblock(getblock(M.dna.struc_enzymes,block,3)),3)
M.dna.struc_enzymes = newdna
return
/////////////////////////// DNA MISC-PROCS
+19 -16
View File
@@ -5,31 +5,34 @@
block=MONKEYBLOCK
/datum/dna/gene/monkey/can_activate(var/mob/M,var/flags)
return istype(M, /mob/living/carbon/human)
return ishuman(M)
/datum/dna/gene/monkey/activate(var/mob/living/carbon/human/H, var/connected, var/flags)
if(!istype(H,/mob/living/carbon/human))
// testing("Cannot monkey-ify [M], type is [M.type].")
return
if(issmall(H)) // Already a monkey
if(issmall(H))
return
for(var/obj/item/W in H)
if(istype(W,/obj/item/organ))
continue
if(istype(W,/obj/item/weapon/implant))
continue
H.unEquip(W)
H.regenerate_icons()
H.canmove = 0
H.stunned = 1
H.icon = null
H.invisibility = 101
var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc )
var/atom/movable/overlay/animation = new /atom/movable/overlay(H.loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = H
flick("h2monkey", animation)
sleep(48)
//animation = null
sleep(22)
qdel(animation)
H.stunned = 0
H.update_canmove()
H.invisibility = initial(H.invisibility)
@@ -43,33 +46,34 @@
if(H.hud_used)
H.hud_used.instantiate()
H << "<B>You are now a [H.species.name]. </B>"
qdel(animation)
H << "<B>You are now a [H.species.name].</B>"
return H
/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags)
if(!istype(H,/mob/living/carbon/human))
// testing("Cannot monkey-ify [M], type is [M.type].")
return
for(var/obj/item/W in H)
if (W==H.w_uniform) // will be torn
if (W == H.w_uniform) // will be torn
continue
if(istype(W,/obj/item/organ))
continue
if(istype(W,/obj/item/weapon/implant))
continue
H.unEquip(W)
H.regenerate_icons()
H.canmove = 0
H.stunned = 1
H.icon = null
H.invisibility = 101
var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc )
var/atom/movable/overlay/animation = new /atom/movable/overlay(H.loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = H
flick("monkey2h", animation)
sleep(48)
//animation = null
sleep(22)
qdel(animation)
H.stunned = 0
H.update_canmove()
@@ -84,7 +88,6 @@
if(H.hud_used)
H.hud_used.instantiate()
H << "<B>You are now a [H.species.name]. </B>"
qdel(animation)
H << "<B>You are now a [H.species.name].</B>"
return H
@@ -124,7 +124,6 @@
icon_state = "arm_blade"
item_state = "arm_blade"
flags = ABSTRACT | NODROP
icon_override = 'icons/mob/in-hand/changeling.dmi'
w_class = 5.0
sharp = 1
edge = 1
@@ -206,7 +205,6 @@
flags = NODROP
icon = 'icons/obj/weapons.dmi'
icon_state = "ling_shield"
icon_override = 'icons/mob/in-hand/changeling.dmi'
var/remaining_uses //Set by the changeling ability.
@@ -77,6 +77,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.underwear = "None"
H.undershirt = "None"
H.socks = "None"
H.faction |= "faithless"
H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform)
-2
View File
@@ -39,7 +39,6 @@
on_use_sound = "sound/magic/Disintegrate.ogg"
icon_state = "disintegrate"
item_state = "disintegrate"
icon_override = 'icons/mob/in-hand/spells.dmi'
/obj/item/weapon/melee/touch_attack/disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad
@@ -64,7 +63,6 @@
on_use_sound = "sound/magic/FleshToStone.ogg"
icon_state = "fleshtostone"
item_state = "fleshtostone"
icon_override = 'icons/mob/in-hand/spells.dmi'
/obj/item/weapon/melee/touch_attack/fleshtostone/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //getting hard after touching yourself would also be bad
+7 -5
View File
@@ -1,7 +1,7 @@
/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction")
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg")
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos")
usr << "<B>You summoned [summon_type ? "magic" : "guns"]!</B>"
@@ -30,7 +30,7 @@
if("nuclear")
new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H))
if("deagle")
new /obj/item/weapon/gun/projectile/automatic/deagle/camo(get_turf(H))
new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H))
if("gyrojet")
new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H))
if("pulse")
@@ -47,17 +47,19 @@
if("combatshotgun")
new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H))
if("bulldog")
new /obj/item/weapon/gun/projectile/automatic/bulldog(get_turf(H))
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H))
if("arg")
new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H))
if("mateba")
new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H))
if("sabr")
new /obj/item/weapon/gun/projectile/automatic(get_turf(H))
new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H))
if("crossbow")
new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(get_turf(H))
if("saw")
new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H))
if("car")
new /obj/item/weapon/gun/projectile/automatic/c90gl(get_turf(H))
new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H))
if("boltaction")
new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
else
+1
View File
@@ -42,6 +42,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
var/obj/item/organ/external/affected = H.organs_by_name["head"]
affected.implants += L
L.part = affected
callHook("captain_spawned", list("captain" = H))
return 1
get_access()
File diff suppressed because it is too large Load Diff
+12 -7
View File
@@ -11,9 +11,15 @@
var/processing = 0
var/icon_keyboard = "generic_key"
var/icon_screen = "generic"
var/light_range_on = 2
var/light_power_on = 1
var/light_range_on = 3
var/light_power_on = 2
var/overlay_layer
atom_say_verb = "beeps"
/obj/machinery/computer/New()
overlay_layer = layer
..()
/obj/machinery/computer/initialize()
power_change()
update_icon()
@@ -64,18 +70,18 @@
/obj/machinery/computer/update_icon()
overlays.Cut()
var/overlay_layer = LIGHTING_LAYER+0.1
if(stat & NOPOWER)
if(icon_keyboard)
overlays += image(icon,"[icon_keyboard]_off",overlay_layer)
return
overlays += image(icon, icon_keyboard ,overlay_layer)
if(stat & BROKEN)
overlays += image(icon,"[icon_state]_broken",overlay_layer)
else
overlays += image(icon,icon_screen,overlay_layer)
if(icon_keyboard)
overlays += image(icon, icon_keyboard ,overlay_layer)
/obj/machinery/computer/power_change()
@@ -86,7 +92,6 @@
else
set_light(light_range_on, light_power_on)
/obj/machinery/computer/proc/set_broken()
stat |= BROKEN
update_icon()
+1
View File
@@ -238,6 +238,7 @@ FIRE ALARM
if (!( src.working ))
return
var/area/A = get_area(src)
A.fire_reset()
for(var/obj/machinery/firealarm/FA in A)
fire_alarm.clearAlarm(loc, FA)
return
+1 -1
View File
@@ -381,7 +381,7 @@ Class Procs:
for(var/obj/item/I in component_parts)
if(I.reliability != 100 && crit_fail)
I.crit_fail = 1
I.loc = src.loc
I.forceMove(loc)
qdel(src)
/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/weapon/screwdriver/S)
+16
View File
@@ -842,6 +842,22 @@
/obj/item/weapon/cartridge/atmos = 75,/obj/item/weapon/cartridge/janitor = 100,/obj/item/weapon/cartridge/signal/toxins = 150,
/obj/item/weapon/cartridge/signal = 75,/obj/item/weapon/cartridge = 50)
/obj/machinery/vending/liberationstation
name = "\improper Liberation Station"
desc = "An overwhelming amount of <b>ancient patriotism</b> washes over you just by looking at the machine."
icon_state = "liberationstation"
req_access_txt = "1"
product_slogans = "Liberation Station: Your one-stop shop for all things second amendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!"
product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?"
vend_reply = "Remember the name: Liberation Station!"
products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2,
/obj/item/weapon/gun/projectile/automatic/pistol/m2411 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2,
/obj/item/weapon/gun/projectile/shotgun/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1,
/obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2)
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3)
/obj/machinery/vending/cigarette
name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating
desc = "If you want to get cancer, might as well do it in style"
+1 -1
View File
@@ -3,7 +3,7 @@
name = "H.O.N.K"
icon_state = "honker"
initial_icon = "honker"
step_in = 2
step_in = 3
health = 140
deflect_chance = 60
internal_damage_threshold = 60
+1 -1
View File
@@ -3,7 +3,7 @@
name = "Odysseus"
icon_state = "odysseus"
initial_icon = "odysseus"
step_in = 2
step_in = 3
max_temperature = 15000
health = 120
wreckage = /obj/effect/decal/mecha_wreckage/odysseus
+18 -2
View File
@@ -8,7 +8,8 @@
health = 200
lights_power = 7
deflect_chance = 15
damage_absorption = list("brute"=0.6,"bomb"=0.2)
damage_absorption = list("brute"=0.6,"fire"=1,"bullet"=0.8,"laser"=0.9,"energy"=1,"bomb"=0.6)
max_equip = 6
wreckage = /obj/effect/decal/mecha_wreckage/ripley
var/list/cargo = new
var/cargo_capacity = 15
@@ -64,7 +65,8 @@
max_temperature = 65000
health = 250
lights_power = 7
damage_absorption = list("fire"=0.5,"bullet"=0.8,"bomb"=0.5)
damage_absorption = list("brute"=0.6,"fire"=0.5,"bullet"=0.7,"laser"=0.7,"energy"=1,"bomb"=0.4)
max_equip = 5 // More armor, less tools
wreckage = /obj/effect/decal/mecha_wreckage/ripley/firefighter
/obj/mecha/working/ripley/deathripley
@@ -73,7 +75,10 @@
icon_state = "deathripley"
step_in = 2
opacity=0
max_temperature = 65000
health = 300
lights_power = 7
damage_absorption = list("brute"=0.6,"fire"=0.4,"bullet"=0.6,"laser"=0.6,"energy"=1,"bomb"=0.3)
wreckage = /obj/effect/decal/mecha_wreckage/ripley/deathripley
step_energy_drain = 0
@@ -97,12 +102,23 @@
var/obj/item/mecha_parts/mecha_equipment/tool/drill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill
D.attach(src)
//Add possible plasma cutter
if(prob(25))
var/obj/item/mecha_parts/mecha_equipment/M = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
M.attach(src)
//Add ore box to cargo
cargo.Add(new /obj/structure/ore_box(src))
//Attach hydrolic clamp
var/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp
HC.attach(src)
for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily
qdel(B)
var/obj/item/mecha_parts/mecha_equipment/tool/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/tool/mining_scanner
scanner.attach(src)
/obj/mecha/working/ripley/Exit(atom/movable/O)
if(O in cargo)
return 0
@@ -26,7 +26,7 @@
/obj/item/weapon/gun/projectile/automatic/pistol = 8,
/obj/item/weapon/gun/projectile/shotgun/combat = 5,
/obj/item/weapon/gun/projectile/revolver/mateba,
/obj/item/weapon/gun/projectile/automatic/deagle
/obj/item/weapon/gun/projectile/automatic/pistol/deagle
)
/obj/effect/spawner/lootdrop/maintenance
+8
View File
@@ -6,6 +6,14 @@
var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite
var/blood_overlay_color = null
var/item_state = null
var/lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
var/righthand_file = 'icons/mob/inhands/items_righthand.dmi'
//Dimensions of the lefthand_file and righthand_file vars
//eg: 32x32 sprite, 64x64 sprite, etc.
var/inhand_x_dimension = 32
var/inhand_y_dimension = 32
var/r_speed = 1.0
var/health = null
var/hitsound = null
@@ -11,7 +11,6 @@
icon_state = "camera_bug"
w_class = 1.0
item_state = "camera_bug"
icon_override = 'icons/mob/in-hand/tools.dmi'
throw_speed = 4
throw_range = 20
-1
View File
@@ -3,7 +3,6 @@
desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production."
icon_state = "flash"
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
icon_override = 'icons/mob/in-hand/tools.dmi'
throwforce = 0
w_class = 1
throw_speed = 3
@@ -95,7 +95,6 @@
desc = "A robust flashlight used by security."
icon_state = "seclite"
item_state = "seclite"
icon_override = 'icons/mob/in-hand/tools.dmi'
force = 9 // Not as good as a stun baton.
brightness_on = 5 // A little better than the standard flashlight.
hitsound = 'sound/weapons/genhit1.ogg'
@@ -6,7 +6,6 @@
icon = 'icons/obj/musician.dmi'
icon_state = "guitar"
item_state = "guitar"
icon_override = 'icons/mob/in-hand/tools.dmi'
force = 10
var/datum/song/handheld/song
hitsound = 'sound/effects/guitarsmash.ogg'
@@ -113,7 +113,6 @@ REAGENT SCANNER
name = "Health Analyzer"
icon_state = "health"
item_state = "healthanalyzer"
icon_override = 'icons/mob/in-hand/tools.dmi'
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -76,7 +76,6 @@ effective or pretty fucking useless.
name = "Health Analyzer"
icon_state = "health2"
item_state = "healthanalyzer"
icon_override = 'icons/mob/in-hand/tools.dmi'
desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end."
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -3,7 +3,6 @@
desc = "Used by obese officers to save their breath for running."
icon_state = "voice0"
item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang)
icon_override = 'icons/mob/in-hand/tools.dmi'
w_class = 1.0
flags = CONDUCT
+4 -2
View File
@@ -131,6 +131,8 @@
icon = 'icons/obj/gun.dmi'
icon_state = "revolver"
item_state = "gun"
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
flags = CONDUCT
slot_flags = SLOT_BELT
w_class = 3.0
@@ -204,6 +206,8 @@
icon = 'icons/obj/gun.dmi'
icon_state = "crossbow"
item_state = "crossbow"
lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
w_class = 2.0
attack_verb = list("attacked", "struck", "hit")
var/bullets = 5
@@ -1096,7 +1100,6 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/toy.dmi'
icon_state = "foamblade"
item_state = "arm_blade"
icon_override = 'icons/mob/in-hand/changeling.dmi'
attack_verb = list("pricked", "absorbed", "gored")
w_class = 2
@@ -1109,7 +1112,6 @@ obj/item/toy/cards/deck/syndicate/black
icon = 'icons/obj/device.dmi'
icon_state = "flash"
item_state = "flashtool"
icon_override = 'icons/mob/in-hand/tools.dmi'
w_class = 1
/obj/item/toy/flash/attack(mob/living/M, mob/user)
@@ -41,7 +41,6 @@
icon = 'icons/obj/chronos.dmi'
icon_state = "chronogun"
item_state = "chronogun"
icon_override = 'icons/mob/in-hand/guns.dmi'
w_class = 3.0
projectile_type = "/obj/item/projectile/energy/chrono_beam"
fire_sound = 'sound/weapons/Laser.ogg'
-2
View File
@@ -6,7 +6,6 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "defibunit"
item_state = "defibunit"
icon_override = 'icons/mob/in-hand/tools.dmi'
slot_flags = SLOT_BACK
force = 5
throwforce = 6
@@ -249,7 +248,6 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "defibpaddles"
item_state = "defibpaddles"
icon_override = 'icons/mob/in-hand/tools.dmi'
force = 0
throwforce = 6
w_class = 4
@@ -8,7 +8,6 @@ var/turf/T
icon = 'icons/obj/grenade.dmi'
icon_state = "banana"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
var/deliveryamt = 8
var/spawner_type = /obj/item/weapon/bananapeel
@@ -7,7 +7,6 @@
desc = "A do it yourself grenade casing!"
icon_state = "chemg"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
var/bomb_state = "chembomb"
var/payload_name = null // used for spawned grenades
w_class = 2
@@ -3,7 +3,6 @@
desc = "HONK! brand Bananas. In a special applicator for rapid slipping of wide areas."
icon_state = "banana"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
w_class = 2.0
force = 2.0
var/stage = 0
@@ -2,7 +2,6 @@
name = "classic emp grenade"
icon_state = "emp"
item_state = "emp"
icon_override = 'icons/mob/in-hand/tools.dmi'
origin_tech = "materials=2;magnets=3"
prime()
@@ -2,7 +2,6 @@
name = "flashbang"
icon_state = "flashbang"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
origin_tech = "materials=2;combat=1"
var/banglet = 0
@@ -21,7 +21,6 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "improvised_grenade"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
throw_speed = 3
throw_range = 7
flags = CONDUCT
@@ -72,7 +71,6 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "improvised_grenade"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
throw_speed = 3
throw_range = 7
flags = CONDUCT
@@ -5,7 +5,6 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "grenade"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
throw_speed = 4
throw_range = 20
flags = CONDUCT
@@ -5,7 +5,6 @@
icon_state = "flashbang"
det_time = 20
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
slot_flags = SLOT_BELT
var/datum/effect/effect/system/bad_smoke_spread/smoke
@@ -4,7 +4,6 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "delivery"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
origin_tech = "materials=3;magnets=4"
var/banglet = 0
var/spawner_type = null // must be an object path
@@ -4,7 +4,6 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "syndicate"
item_state = "flashbang"
icon_override = 'icons/mob/in-hand/tools.dmi'
origin_tech = "materials=3;magnets=4;syndicate=4"
/obj/item/weapon/grenade/syndieminibomb/prime()
@@ -110,7 +110,6 @@
desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running."
gender = NEUTER
icon = 'icons/obj/weapons.dmi'
icon_override = 'icons/mob/in-hand/swords.dmi'
icon_state = "bolas"
siemens_coefficient = 1
slot_flags = SLOT_BELT
@@ -36,7 +36,6 @@
name = "energy sword"
desc = "May the force be within you."
icon_state = "sword0"
icon_override = 'icons/mob/in-hand/swords.dmi'
force = 3.0
throwforce = 5.0
throw_speed = 1
@@ -155,3 +155,9 @@
/obj/item/weapon/stock_parts/cell/emproof/corrupt()
return
/obj/item/weapon/stock_parts/cell/temperaturegun
name = "temperature gun cell"
desc = "A specially designed power cell for heating and cooling projectiles"
icon_state = "icell"
maxcharge = 900
@@ -88,7 +88,6 @@
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
icon = 'icons/obj/weapons.dmi'
icon_state = "teleriot0"
icon_override = 'icons/mob/in-hand/tools.dmi'
slot_flags = null
force = 3
throwforce = 3
-1
View File
@@ -1,7 +1,6 @@
/obj/item/weapon/picket_sign
icon_state = "picket"
item_state = "picket"
icon_override = 'icons/mob/in-hand/tools.dmi'
name = "blank picket sign"
desc = "It's blank"
force = 5
-2
View File
@@ -17,7 +17,6 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "broom"
item_state = "broom0"
icon_override = 'icons/mob/in-hand/staff.dmi'
/obj/item/weapon/twohanded/staff/broom/attack_self(mob/user as mob)
..()
@@ -58,7 +57,6 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "horsebroom"
item_state = "horsebroom0"
icon_override = 'icons/mob/in-hand/staff.dmi'
/obj/item/weapon/twohanded/staff/broom/horsebroom/attack_self(mob/user as mob)
..()
@@ -5,7 +5,6 @@
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
icon_state = "RPED"
item_state = "RPED"
icon_override = 'icons/mob/in-hand/tools.dmi'
w_class = 5
can_hold = list("/obj/item/weapon/stock_parts")
storage_slots = 50
@@ -12,6 +12,7 @@
slot_flags = SLOT_BACK //ERROOOOO
max_w_class = 3
max_combined_w_class = 21
storage_slots = 21
/obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
playsound(src.loc, "rustle", 50, 1, -5)
@@ -73,7 +74,6 @@
icon_state = "giftbag0"
item_state = "giftbag"
w_class = 4.0
storage_slots = 20
max_w_class = 3
max_combined_w_class = 400 // can store a ton of shit!
@@ -197,7 +197,6 @@
desc = "A very slim satchel that can easily fit into tight spaces."
icon_state = "satchel-flat"
w_class = 3 //Can fit in backpacks itself.
storage_slots = 5
max_combined_w_class = 15
level = 1
cant_hold = list(/obj/item/weapon/storage/backpack/satchel_flat) //muh recursive backpacks
@@ -224,11 +223,9 @@
/obj/item/weapon/storage/backpack/duffel
name = "duffelbag"
desc = "A large grey duffelbag designed to hold more items than a regular bag."
icon_override = 'icons/mob/in-hand/duffelbag.dmi'
icon_state = "duffel"
item_state = "duffel"
storage_slots = 9 // Duffelbags can hold more items.
max_combined_w_class = 27
max_combined_w_class = 30
slowdown = 1
/obj/item/weapon/storage/backpack/duffel/syndie
@@ -272,7 +269,6 @@
desc = "A suspicious looking dufflebag for holding surgery tools."
icon_state = "duffel-syndimed"
item_state = "duffle-syndimed"
storage_slots = 12
/obj/item/weapon/storage/backpack/duffel/syndie/surgery/New()
..()
@@ -12,7 +12,6 @@
name = "first-aid kit"
desc = "It's an emergency medical kit for those serious boo-boos."
icon_state = "firstaid"
icon_override = 'icons/mob/in-hand/medkits.dmi'
throw_speed = 2
throw_range = 8
var/empty = 0
@@ -235,7 +235,7 @@
return 0 //Means the item is already in the storage item
if(contents.len >= storage_slots)
if(!stop_messages)
usr << "<span class='notice'>[src] is full, make some space.</span>"
usr << "<span class='warning'>[W] won't fit in [src], make some space!</span>"
return 0 //Storage item is full
if(can_hold.len)
@@ -200,7 +200,6 @@
desc = "A high-tech nitrogen tank designed specifically for Vox."
icon_state = "emergency_vox"
item_state = "emergency_vox"
icon_override = 'icons/mob/in-hand/tools.dmi'
volume = 25
@@ -108,7 +108,6 @@
icon = 'icons/obj/watertank.dmi'
icon_state = "mister"
item_state = "mister"
icon_override = 'icons/mob/in-hand/tools.dmi'
w_class = 4.0
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(25,50,100)
@@ -210,7 +209,6 @@
icon = 'icons/obj/watertank.dmi'
icon_state = "atmos_nozzle"
item_state = "nozzleatmos"
icon_override = 'icons/mob/in-hand/tools.dmi'
safety = 0
max_water = 200
power = 8
+2 -9
View File
@@ -199,7 +199,6 @@ obj/item/weapon/twohanded/
/obj/item/weapon/twohanded/dualsaber
var/hacked = 0
var/blade_color
icon_override = 'icons/mob/in-hand/swords.dmi'
icon_state = "dualsaber0"
name = "double-bladed energy sword"
desc = "Handle with care."
@@ -365,7 +364,6 @@ obj/item/weapon/twohanded/
///CHAINSAW///
/obj/item/weapon/twohanded/chainsaw
icon_override = 'icons/mob/in-hand/swords.dmi'
icon_state = "chainsaw0"
name = "Chainsaw"
desc = "Perfect for felling trees or fellow spacemen."
@@ -423,8 +421,6 @@ obj/item/weapon/twohanded/
/obj/item/weapon/twohanded/singularityhammer
name = "singularity hammer"
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
icon_override = 'icons/mob/in-hand/swords.dmi'
icon_state = "mjollnir0"
flags = CONDUCT
slot_flags = SLOT_BACK
@@ -498,7 +494,6 @@ obj/item/weapon/twohanded/
/obj/item/weapon/twohanded/mjollnir
name = "Mjollnir"
desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy."
icon_override = 'icons/mob/in-hand/swords.dmi'
icon_state = "mjollnir0"
flags = CONDUCT
slot_flags = SLOT_BACK
@@ -546,9 +541,7 @@ obj/item/weapon/twohanded/
/obj/item/weapon/twohanded/knighthammer
name = "singuloth knight's hammer"
desc = "A hammer made of sturdy metal with a golden skull adorned with wings on either side of the head. <br>This weapon causes devastating damage to those it hits due to a power field sustained by a mini-singularity inside of the hammer."
icon_override = 'icons/mob/in-hand/swords.dmi'
icon_state = "adrhammer0"
icon_state = "knighthammer0"
flags = CONDUCT
slot_flags = SLOT_BACK
no_embed = 1
@@ -579,7 +572,7 @@ obj/item/weapon/twohanded/
return
/obj/item/weapon/twohanded/knighthammer/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "adrhammer[wielded]"
icon_state = "knighthammer[wielded]"
return
@@ -45,6 +45,12 @@ LINEN BINS
icon_state = "sheetpurple"
_color = "purple"
/obj/item/weapon/bedsheet/patriot
name = "patriotic bedsheet"
desc = "You've never felt more free than when sleeping on this."
icon_state = "sheetUSA"
_color = "sheetUSA"
/obj/item/weapon/bedsheet/rainbow
name = "rainbow bedsheet"
desc = "A multi_colored blanket. It's actually several different sheets cut up and sewn together."
@@ -44,11 +44,11 @@
new /obj/item/weapon/storage/box/teargas(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/backpack/duffel/syndie/med(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/weapon/pinpointer/nukeop(src)
new /obj/item/weapon/pinpointer/nukeop(src)
+129 -68
View File
@@ -1,55 +1,88 @@
#define DISPLAYCASE_FRAME_CIRCUIT 0
#define DISPLAYCASE_FRAME_SCREWDRIVER 1
// List and hook used to set up the captain's print on their display case
var/global/list/captain_display_cases = list()
/hook/captain_spawned/proc/displaycase(mob/living/carbon/human/captain)
if(!captain_display_cases.len)
return 1
var/fingerprint = captain.get_full_print()
for(var/obj/structure/displaycase/D in captain_display_cases)
if(istype(D))
D.ue = fingerprint
return 1
/obj/structure/displaycase_frame
name = "display case frame"
icon = 'icons/obj/stock_parts.dmi'
icon_state="box_glass"
icon_state = "box_glass"
var/obj/item/weapon/airlock_electronics/circuit = null
var/state=0
var/obj/item/device/assembly/prox_sensor/sensor = null
var/state = DISPLAYCASE_FRAME_CIRCUIT
/obj/structure/displaycase_frame/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
var/pstate=state
var/turf/T=get_turf(src)
var/pstate = state
var/turf/T = get_turf(src)
switch(state)
if(0)
if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked")
if(DISPLAYCASE_FRAME_CIRCUIT)
if(istype(W, /obj/item/weapon/airlock_electronics) && W.icon_state != "door_electronics_smoked")
user.drop_item()
circuit = W
circuit.loc = src
circuit.forceMove(src)
state++
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
user << "<span class='notice'>You add the airlock electronics to the frame.</span>"
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
if(istype(W, /obj/item/weapon/crowbar))
new /obj/machinery/constructable_frame/machine_frame(T)
new /obj/item/stack/sheet/glass(T)
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(T)
G.amount = 5
qdel(src)
user << "<span class='notice'>You pry the glass out of the frame.</span>"
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
return
if(1)
if(DISPLAYCASE_FRAME_SCREWDRIVER)
if(isscrewdriver(W))
var/obj/structure/displaycase/C=new(T)
var/obj/structure/displaycase/C = new(T)
if(circuit.one_access)
C.req_access = null
C.req_one_access = circuit.conf_access
else
C.req_access = circuit.conf_access
C.req_one_access = null
if(isprox(sensor))
C.burglar_alarm = 1
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
qdel(src)
return
if(istype(W, /obj/item/weapon/crowbar))
circuit.loc=T
circuit=null
circuit.forceMove(T)
circuit = null
if(isprox(sensor))
sensor.forceMove(T)
sensor = null
state--
user << "<span class='notice'>You pry the electronics out of the frame.</span>"
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
if(pstate!=state)
pstate=state
if(isprox(W) && !isprox(sensor))
user.drop_item()
sensor = W
sensor.forceMove(src)
user << "<span class='notice'>You add the proximity sensor to the frame.</span>"
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(pstate != state)
pstate = state
update_icon()
/obj/structure/displaycase_frame/update_icon()
switch(state)
if(1)
icon_state="box_glass_circuit"
icon_state = "box_glass_circuit"
else
icon_state="box_glass"
icon_state = "box_glass"
/obj/structure/displaycase
name = "display case"
@@ -58,42 +91,52 @@
desc = "A display case for prized possessions. It taunts you to kick it."
density = 1
anchored = 1
unacidable = 1//Dissolving the case would also delete the contents.
unacidable = 1 //Dissolving the case would also delete the contents.
var/health = 30
var/obj/item/occupant = null
var/destroyed = 0
var/locked = 0
var/burglar_alarm = 0
var/ue = null
var/image/occupant_overlay = null
var/obj/item/weapon/airlock_electronics/circuit
/obj/structure/displaycase/captains_laser
name = "captain's display case"
desc = "A display case for the captain's antique laser gun. It taunts you to kick it."
desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system."
burglar_alarm = 1
/obj/structure/displaycase/captains_laser/New()
captain_display_cases += src
req_access = list(access_captain)
locked = 1
spawn(5)
occupant = new /obj/item/weapon/gun/energy/laser/captain(src)
update_icon()
/obj/structure/proc/getPrint(mob/user as mob)
return md5(user:dna:uni_identity)
/obj/structure/displaycase/Destroy()
dump()
qdel(circuit)
circuit = null
return ..()
/obj/structure/displaycase/captain_laser/Destroy()
captain_display_cases -= src
return ..()
/obj/structure/displaycase/examine(mob/user)
..(user)
user << "\blue Peering through the glass, you see that it contains:"
user << "<span class='notice'>Peering through the glass, you see that it contains:</span>"
if(occupant)
user << "\icon[occupant] \blue \A [occupant]"
user << "\icon[occupant] <span class='notice'>\A [occupant].</span>"
else
user << "Nothing."
/obj/structure/displaycase/proc/dump()
if(occupant)
occupant.loc=get_turf(src)
occupant=null
occupant_overlay=null
occupant.forceMove(get_turf(src))
occupant = null
occupant_overlay = null
/obj/structure/displaycase/ex_act(severity)
switch(severity)
@@ -111,7 +154,6 @@
src.health -= 5
src.healthcheck()
/obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj)
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
health -= Proj.damage
@@ -127,16 +169,27 @@
/obj/structure/displaycase/proc/healthcheck()
if (src.health <= 0)
health = 0
if (!( src.destroyed ))
src.density = 0
src.destroyed = 1
PoolOrNew(/obj/item/weapon/shard, loc)
playsound(get_turf(src), "shatter", 70, 1)
update_icon()
burglar_alarm()
else
playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1)
return
/obj/structure/displaycase/proc/burglar_alarm()
if(burglar_alarm)
var/area/alarmed = get_area(src)
alarmed.burglaralert(src)
visible_message("<span class='danger'>The burglar alarm goes off!</span>")
return 1
return 0
/obj/structure/displaycase/update_icon()
if(src.destroyed)
src.icon_state = "glassbox2b"
@@ -147,102 +200,110 @@
var/icon/occupant_icon=getFlatIcon(occupant)
occupant_icon.Scale(16,16)
occupant_overlay = image(occupant_icon)
occupant_overlay.pixel_x=8
occupant_overlay.pixel_y=8
occupant_overlay.pixel_x = 8
occupant_overlay.pixel_y = 8
if(locked)
occupant_overlay.alpha=128//ChangeOpacity(0.5)
//underlays += occupant_overlay
occupant_overlay.alpha = 128
overlays += occupant_overlay
return
/obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/card))
var/obj/item/weapon/card/id/I=W
var/obj/item/weapon/card/id/I = W
if(!check_access(I))
user << "\red Access denied."
user << "<span class='warning'>Access denied.</span>"
return
locked = !locked
if(!locked)
user << "\icon[src] \blue \The [src] clicks as locks release, and it slowly opens for you."
user << "\icon[src] <span class='notice'>\The [src] clicks as locks release, and it slowly opens for you.</span>"
else
user << "\icon[src] \blue You close \the [src] and swipe your card, locking it."
user << "\icon[src] <span class='notice'>You close \the [src] and swipe your card, locking it.</span>"
update_icon()
return
if(istype(W,/obj/item/weapon/crowbar) && (!locked || destroyed))
user.visible_message("[user.name] pries \the [src] apart.", \
"You pry \the [src] apart.", \
"You hear something pop.")
var/turf/T=get_turf(src)
var/turf/T = get_turf(src)
playsound(T, 'sound/items/Crowbar.ogg', 50, 1)
dump()
var/obj/item/weapon/airlock_electronics/C = circuit
if(!C)
C=new (src)
C.one_access=!(req_access && req_access.len>0)
C = new (src)
C.one_access = !(req_access && req_access.len>0)
if(!C.one_access)
C.conf_access=req_access
C.conf_access = req_access
else
C.conf_access=req_one_access
C.conf_access = req_one_access
if(!destroyed)
var/obj/structure/displaycase_frame/F=new(T)
F.state=1
F.circuit=C
F.circuit.loc=F
var/obj/structure/displaycase_frame/F = new(T)
F.state = DISPLAYCASE_FRAME_SCREWDRIVER
F.circuit = C
F.circuit.forceMove(F)
if(burglar_alarm)
new /obj/item/device/assembly/prox_sensor(T)
F.update_icon()
else
C.loc=T
circuit=null
C.forceMove(T)
circuit = null
new /obj/machinery/constructable_frame/machine_frame(T)
qdel(src)
return
if(user.a_intent == I_HARM)
src.health -= W.force
src.healthcheck()
..()
if(locked && !destroyed)
src.health -= W.force
src.healthcheck()
..()
else if(!locked)
dump()
user << "<span class='danger'>You smash \the [W] into the delicate electronics at the bottom of the case, and deactivate the hover field.</span>"
update_icon()
else
if(locked)
user << "\red It's locked, you can't put anything into it."
user << "<span class='warning'>It's locked, you can't put anything into it.</span>"
return
if(!occupant)
user << "\blue You insert \the [W] into \the [src], and it floats as the hoverfield activates."
user << "<span class='notice'>You insert \the [W] into \the [src], and it floats as the hoverfield activates.</span>"
user.drop_item()
W.loc=src
W.forceMove(src)
occupant=W
update_icon()
/obj/structure/displaycase/attack_hand(mob/user as mob)
if (destroyed)
if (destroyed || (!locked && user.a_intent == I_HARM))
if(occupant)
dump()
user << "\red You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field permanently."
user << "<span class='danger'>You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field.</span>"
src.add_fingerprint(user)
update_icon()
else
if(user.a_intent == I_HARM)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("\red [user.name] kicks \the [src]!", \
"\red You kick \the [src]!", \
user.visible_message("<span class='danger'>[user.name] kicks \the [src]!</span>", \
"<span class='danger'>You kick \the [src]!</span>", \
"You hear glass crack.")
src.health -= 2
healthcheck()
else if(!locked)
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/print = H.get_full_print()
if(!ue)
user << "\blue Your press your thumb against the fingerprint scanner, registering your identity with the case."
ue = getPrint(user)
user << "<span class='notice'>Your press your thumb against the fingerprint scanner, registering your identity with the case.</span>"
ue = print
return
if(ue!=getPrint(user))
user << "\red Access denied."
if(ue != print)
user << "<span class='warning'>Access denied.</span>"
return
if(occupant)
user << "\blue Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case."
user << "<span class='notice'>Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case.</span>"
dump()
update_icon()
else
src << "\icon[src] \red \The [src] is empty!"
src << "\icon[src] <span class='warning'>\The [src] is empty!</span>"
else
user.visible_message("[user.name] gently runs his hands over \the [src] in appreciation of its contents.", \
"You gently run your hands over \the [src] in appreciation of its contents.", \
@@ -63,7 +63,7 @@
handle_rotation()
if(pulling) // Driver
if(pulling.loc == src.loc) // We moved onto the wheelchair? Revert!
pulling.loc = T
pulling.forceMove(T)
else
spawn(0)
if(get_dist(src, pulling) > 1) // We are too far away? Losing control.
@@ -95,7 +95,7 @@
pulling = null
else
if (occupant && (src.loc != occupant.loc))
src.loc = occupant.loc // Failsafe to make sure the wheelchair stays beneath the occupant after driving
forceMove(occupant.loc) // Failsafe to make sure the wheelchair stays beneath the occupant after driving
handle_rotation()
/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob)
@@ -848,6 +848,7 @@
anchored = 1.0
throwpass = 1 //You can throw objects over this, despite it's density.
var/parts = /obj/item/weapon/rack_parts
var/health = 5
/obj/structure/rack/proc/destroy()
new parts(loc)
@@ -914,6 +915,14 @@
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
destroy()
else
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
playsound(loc, 'sound/items/dodgeball.ogg', 80, 1)
user.visible_message("<span class='warning'>[user] kicks [src].</span>", \
"<span class='danger'>You kick [src].</span>")
health -= rand(1,2)
healthcheck()
/obj/structure/rack/mech_melee_attack(obj/mecha/M)
visible_message("<span class='danger'>[M] smashes [src] apart!</span>")
@@ -933,3 +942,7 @@
/obj/structure/rack/attack_tk() // no telehulk sorry
return
/obj/structure/rack/proc/healthcheck()
if(health <= 0)
destroy()
+11 -3
View File
@@ -138,6 +138,7 @@ var/list/mechtoys = list(
var/ordernum
var/datum/supply_packs/object = null
var/orderedby = null
var/orderedrank = null
var/comment = null
/datum/controller/supply
@@ -300,14 +301,19 @@ var/list/mechtoys = list(
var/datum/supply_packs/SP = SO.object
var/atom/A = new SP.containertype(pickedloc)
A.name = "[SP.containername]"// [SO.comment ? "([SO.comment])":"" ]"
A.name = "[SP.containername]"
//supply manifest generation begin
var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A)
slip.name = "Shipping Manifest - '[SP.name]' for [SO.orderedby]"
slip.info = "<h3>[command_name()] Shipping Manifest</h3><hr><br>"
slip.info +="Order #[SO.ordernum]<br>"
slip.info +="Order: #[SO.ordernum]<br>"
slip.info +="Destination: [station_name]<br>"
slip.info +="Requested By: [SO.orderedby]<br>"
slip.info +="Rank: [SO.orderedrank]<br>"
slip.info +="Reason: [SO.comment]<br>"
slip.info +="Supply Crate Type: [SP.name]<br>"
slip.info +="Access Restriction: [replacetext(get_access_desc(SP.access))]<br>"
slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT<br>"
slip.info +="CONTENTS:<br><ul>"
@@ -482,6 +488,7 @@ var/list/mechtoys = list(
O.ordernum = supply_controller.ordernum
O.object = P
O.orderedby = idname
O.orderedrank = idrank
O.comment = reason
supply_controller.requestlist += O
@@ -691,6 +698,7 @@ var/list/mechtoys = list(
O.ordernum = supply_controller.ordernum
O.object = P
O.orderedby = idname
O.orderedrank = idrank
O.comment = reason
supply_controller.requestlist += O
+1 -1
View File
@@ -606,7 +606,7 @@ var/global/nologevent = 0
return
if(confirm == "Yes")
var/delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num
if(!delay)
if(isnull(delay))
delay = 50
else
delay = delay * 10
+4 -6
View File
@@ -2,16 +2,14 @@
set name = "Broken Sprite List"
set category = "Debug"
var/icon/IL = new('icons/mob/items_lefthand.dmi')
var/list/Lstates = IL.IconStates()
var/icon/IR = new('icons/mob/items_righthand.dmi')
var/list/Rstates = IR.IconStates()
var/text
for(var/A in typesof(/obj/item))
var/obj/item/O = new A( locate(1,1,1) )
if(!O) continue
var/icon/IL = new(O.lefthand_file)
var/list/Lstates = IL.IconStates()
var/icon/IR = new(O.righthand_file)
var/list/Rstates = IR.IconStates()
var/icon/J = new(O.icon)
var/list/istates = J.IconStates()
if(!Lstates.Find(O.icon_state) && !Lstates.Find(O.item_state))
+1 -1
View File
@@ -704,7 +704,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
if ("tournament chef") //Steven Seagal FTW
+9 -5
View File
@@ -16,7 +16,7 @@
msg = "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[src]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src, "holder")]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>):</b> [msg]"
for(var/client/X in admins)
if(R_EVENT & X.holder.rights)
if(check_rights(R_EVENT,0,X.mob))
X << msg
usr << "Your prayers have been received by the gods."
@@ -37,7 +37,7 @@
msg = "\blue <b><font color='#DC143C'>SYNDICATE: </font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, "holder")]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;SyndicateReply=\ref[Sender]'>REPLY</A>):</b> [msg]"
for(var/client/X in admins)
if(R_EVENT & X.holder.rights)
if(check_rights(R_EVENT,0,X.mob))
X << msg
/proc/HONK_announce(var/text , var/mob/Sender)
@@ -53,12 +53,16 @@
msg = "\blue <b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, "holder")]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;ErtReply=\ref[Sender]'>REPLY</A>):</b> [msg]"
for(var/client/X in admins)
if(R_EVENT & X.holder.rights)
if(check_rights(R_EVENT,0,X.mob))
X << msg
/proc/Nuke_request(text , mob/Sender)
var/nuke_code = get_nuke_code()
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='adminnotice'><b><font color=orange>NUKE CODE REQUEST: </font>[key_name(Sender)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender, "holder")]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;CentcommReply=\ref[Sender]'>RPLY</A>):</b> [msg]</span>"
admins << msg
admins << "<span class='adminnotice'><b>The nuke code is [nuke_code].</b></span>"
for(var/client/X in admins)
if(check_rights(R_EVENT,0,X.mob))
X << msg
X << "<span class='adminnotice'><b>The nuke code is [nuke_code].</b></span>"
@@ -160,7 +160,7 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/grenade/empgrenade(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/m2411(src), slot_belt)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m2411(src), slot_belt)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw(src), slot_r_hand)
+2
View File
@@ -0,0 +1,2 @@
/datum/alarm_handler/burglar
category = "Burglar Alarms"
+28 -3
View File
@@ -128,6 +128,7 @@ datum/preferences
var/species = "Human"
var/language = "None" //Secondary language
var/body_accessory = null
var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess
@@ -366,10 +367,14 @@ datum/preferences
dat += "<br><b>Eyes</b><br>"
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]'><tr><td>__</td></tr></table></font><br>"
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Vulpkanin")
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Vulpkanin" || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
dat += "<br><b>Body Color</b><br>"
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_skin, 2)][num2hex(g_skin, 2)][num2hex(b_skin)]'><tr><td>__</td></tr></table></font>"
if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
dat += "<br><b>Body Accessory</b><br>"
dat += "Accessory: <a href='?_src_=prefs;preference=body_accessory;task=input'>[body_accessory ? "[body_accessory]" : "None"]</a><br>"
dat += "</td></tr></table><hr><center>"
if (1) // General Preferences
@@ -1165,10 +1170,27 @@ datum/preferences
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
if(new_h_style)
h_style = new_h_style
if("body_accessory")
var/list/possible_body_accessories = list()
if(check_rights(R_ADMIN, 1, user))
possible_body_accessories = body_accessory_by_name.Copy()
else
for(var/B in body_accessory_by_name)
var/datum/body_accessory/accessory = body_accessory_by_name[B]
if(!istype(accessory))
possible_body_accessories += "None" //the only null entry should be the "None" option
continue
if(species in accessory.allowed_species)
possible_body_accessories += B
var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
if(new_body_accessory)
body_accessory = new_body_accessory
if("facial")
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") as color|null
if(new_facial)
@@ -1246,7 +1268,7 @@ datum/preferences
s_tone = 35 - max(min( round(new_s_tone), 220),1)
if("skin")
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People"|| species == "Vulpkanin")
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People"|| species == "Vulpkanin" || body_accessory_by_species[species] || check_rights(R_ADMIN, 1, user))
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null
if(new_skin)
r_skin = hex2num(copytext(new_skin, 2, 4))
@@ -1571,6 +1593,9 @@ datum/preferences
character.undershirt = undershirt
character.socks = socks
if(body_accessory)
character.body_accessory = body_accessory_by_name["[body_accessory]"]
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
+11 -5
View File
@@ -151,7 +151,8 @@
//socks
socks = query.item[54]
body_accessory = query.item[55]
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name)
@@ -200,7 +201,7 @@
be_special = sanitize_integer(be_special, 0, 65535, initial(be_special))
socks = sanitize_text(socks, initial(socks))
body_accessory = sanitize_text(body_accessory, initial(body_accessory))
// if(isnull(disabilities)) disabilities = 0
if(!player_alt_titles) player_alt_titles = new()
@@ -274,7 +275,8 @@
rlimb_data='[rlimblist]',
nanotrasen_relation='[nanotrasen_relation]',
speciesprefs='[speciesprefs]',
socks='[socks]'
socks='[socks]',
body_accessory='[body_accessory]'
WHERE ckey='[C.ckey]'
AND slot='[default_slot]'"}
)
@@ -302,7 +304,9 @@
job_karma_high, job_karma_med, job_karma_low,
flavor_text, med_record, sec_record, gen_record,
player_alt_titles, be_special,
disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks)
disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs,
socks, body_accessory)
VALUES
('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]',
'[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(language)]',
@@ -319,7 +323,9 @@
'[job_karma_high]', '[job_karma_med]', '[job_karma_low]',
'[sql_sanitize_text(flavor_text)]', '[sql_sanitize_text(med_record)]', '[sql_sanitize_text(sec_record)]', '[sql_sanitize_text(gen_record)]',
'[playertitlelist]', '[be_special]',
'[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]','[socks]')
'[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]',
'[socks]', '[body_accessory]')
"}
)
+2
View File
@@ -10,6 +10,8 @@
while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. vox wearing jumpsuits).
*/
var/list/sprite_sheets_refit = null
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
//BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot)
@@ -174,3 +174,23 @@
desc = "An EVA suit specifically designed for the clown. SPESSHONK!"
icon_state = "spaceclown_suit"
item_state = "spaceclown_items"
/obj/item/clothing/head/helmet/space/freedom
name = "eagle helmet"
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
icon_state = "griffinhat"
item_state = "griffinhat"
armor = list(melee = 40, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
/obj/item/clothing/suit/space/freedom
name = "eagle suit"
desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit and the wings appear to be stuck in 'freedom' mode."
icon_state = "freedom"
item_state = "freedom"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
armor = list(melee = 40, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100)
slowdown = 1
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -11,6 +11,13 @@
icon_state = "blue_pyjamas"
_color = "blue_pyjamas"
item_state = "w_suit"
/obj/item/clothing/under/patriotsuit
name = "Patriotic Suit"
desc = "Motorcycle not included."
icon_state = "ek"
item_state = "ek"
_color = "ek"
/obj/item/clothing/under/captain_fly
name = "rogue captains uniform"
@@ -148,3 +148,10 @@ var/global/datum/controller/plants/plant_controller // Set in New().
/datum/controller/plants/proc/remove_plant(var/obj/effect/plant/plant)
plant_queue -= plant
/client/proc/list_plant_sprites()
if(!plant_controller || !plant_controller.plant_sprites || !plant_controller.plant_sprites.len)
world << "Cannot list plant sprites, plant controller or plant sprites list may not be initialized."
for(var/base in plant_controller.plant_sprites)
world << "[base] : [plant_controller.plant_sprites[base]] growth states"
+4 -3
View File
@@ -43,10 +43,11 @@
kitchen_tag = "ghostchili"
preset_icon = "ghostchilipepper"
/datum/seed/chili/ice/New()
/datum/seed/chili/ghost/New()
..()
set_trait(TRAIT_MATURATION,4)
set_trait(TRAIT_PRODUCTION,4)
set_trait(TRAIT_MATURATION,10)
set_trait(TRAIT_PRODUCTION,10)
set_trait(TRAIT_YIELD,3)
set_trait(TRAIT_PRODUCT_COLOUR,"#00EDC6")
// Berry plants/variants.
+2
View File
@@ -133,6 +133,8 @@
)
//--FalseIncarnate
var/last_plant_ikey //This is for debugging reference, and is otherwise useless. --FalseIncarnate
/obj/machinery/portable_atmospherics/hydroponics/AltClick()
if(mechanical && !usr.stat && !usr.lying && Adjacent(usr))
close_lid(usr)
@@ -36,7 +36,9 @@
if(age >= seed.get_trait(TRAIT_MATURATION))
overlay_stage = seed.growth_stages
else
var/maturation = round(seed.get_trait(TRAIT_MATURATION)/seed.growth_stages)
var/maturation = seed.get_trait(TRAIT_MATURATION)/seed.growth_stages
if(maturation < 1)
maturation = 1
overlay_stage = maturation ? max(1,round(age/maturation)) : 1
var/ikey = "[seed.get_trait(TRAIT_PLANT_ICON)]-[overlay_stage]"
var/image/plant_overlay = plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"]
@@ -45,6 +47,7 @@
plant_overlay.color = seed.get_trait(TRAIT_PLANT_COLOUR)
plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"] = plant_overlay
overlays |= plant_overlay
last_plant_ikey = ikey
if(harvest && overlay_stage == seed.growth_stages)
ikey = "[seed.get_trait(TRAIT_PRODUCT_ICON)]"
+1 -1
View File
@@ -159,7 +159,7 @@
var/new_type = pick(
200; /obj/item/weapon/hatchet, \
/obj/item/weapon/gun/projectile/automatic/pistol, \
/obj/item/weapon/gun/projectile/automatic/deagle, \
/obj/item/weapon/gun/projectile/automatic/pistol/deagle, \
/obj/item/weapon/gun/projectile/revolver/russian, \
)
new new_type(C)
+11 -11
View File
@@ -101,22 +101,23 @@
inserted_id = I
interact(user)
return
if(exchange_parts(user, W))
return
if(default_deconstruction_crowbar(W))
return
if(default_unfasten_wrench(user, W))
return
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
updateUsrDialog()
return
if(panel_open)
if(istype(W, /obj/item/weapon/crowbar))
empty_content()
default_deconstruction_crowbar(W)
return 1
return
if(default_unfasten_wrench(user, W))
return
if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W))
updateUsrDialog()
return
..()
/obj/machinery/mineral/ore_redemption/proc/SmeltMineral(var/obj/item/weapon/ore/O)
@@ -253,7 +254,7 @@
while(s.amount > s.max_amount)
new s.type(loc,s.max_amount)
s.use(s.max_amount)
s.loc = loc
s.forceMove(loc)
s.layer = initial(s.layer)
/**********************Mining Equipment Locker**************************/
@@ -734,7 +735,6 @@
icon = 'icons/obj/syringe.dmi'
icon_state = "lazarus_hypo"
item_state = "hypo"
icon_override = 'icons/mob/in-hand/tools.dmi'
throwforce = 0
w_class = 2.0
throw_speed = 3
-1
View File
@@ -110,7 +110,6 @@
icon = 'icons/obj/mining.dmi'
icon_state = "Gibtonite ore"
item_state = "Gibtonite ore"
icon_override = 'icons/mob/in-hand/tools.dmi'
w_class = 4
throw_range = 0
anchored = 1 //Forces people to carry it by hand, no pulling!
+6 -6
View File
@@ -27,7 +27,7 @@
if(!istype(W))
return 0
if(!l_hand)
W.loc = src //TODO: move to equipped?
W.forceMove(src) //TODO: move to equipped?
l_hand = W
W.layer = 20 //TODO: move to equipped?
// l_hand.screen_loc = ui_lhand
@@ -45,7 +45,7 @@
if(!istype(W))
return 0
if(!r_hand)
W.loc = src
W.forceMove(src)
r_hand = W
W.layer = 20
// r_hand.screen_loc = ui_rhand
@@ -71,7 +71,7 @@
//This is probably the main one you need to know :)
//Just puts stuff on the floor for most mobs, since all mobs have hands but putting stuff in the AI/corgi/ghost hand is VERY BAD.
/mob/proc/put_in_hands(obj/item/W)
W.loc = get_turf(src)
W.forceMove(get_turf(src))
W.layer = initial(W.layer)
W.dropped()
@@ -114,7 +114,7 @@
if(I)
if(client)
client.screen -= I
I.loc = loc
I.forceMove(loc)
I.dropped(src)
if(I)
I.layer = initial(I.layer)
@@ -249,13 +249,13 @@
if (src.back && istype(src.back, /obj/item/weapon/storage/backpack))
var/obj/item/weapon/storage/backpack/B = src.back
if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class)
W.loc = B
W.forceMove(B)
equipped = 1
if(equipped)
W.layer = 20
if(src.back && W.loc != src.back)
W.loc = src
W.forceMove(src)
else
if (del_on_fail)
qdel(W)
+110
View File
@@ -0,0 +1,110 @@
#define AUTOHISS_OFF 0
#define AUTOHISS_BASIC 1
#define AUTOHISS_FULL 2
#define AUTOHISS_NUM 3
/mob/living/proc/handle_autohiss(message, datum/language/L)
return message // no autohiss at this level
/mob/living/carbon/human/handle_autohiss(message, datum/language/L)
if(!client || client.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off
return message
return species.handle_autohiss(message, L, client.autohiss_mode)
/client
var/autohiss_mode = AUTOHISS_OFF
/client/verb/toggle_autohiss()
set name = "Toggle Auto-Accent"
set desc = "Toggle automatic accents for your species"
set category = "OOC"
autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM
switch(autohiss_mode)
if(AUTOHISS_OFF)
src << "Auto-hiss is now OFF."
if(AUTOHISS_BASIC)
src << "Auto-hiss is now BASIC."
if(AUTOHISS_FULL)
src << "Auto-hiss is now FULL."
else
autohiss_mode = AUTOHISS_OFF
src << "Auto-hiss is now OFF."
/datum/species
var/list/autohiss_basic_map = null
var/list/autohiss_extra_map = null
var/list/autohiss_exempt = null
/datum/species/unathi
autohiss_basic_map = list(
"s" = list("ss", "sss", "ssss")
)
autohiss_extra_map = list(
"x" = list("ks", "kss", "ksss")
)
autohiss_exempt = list("Sinta'unathi")
/datum/species/tajaran
autohiss_basic_map = list(
"r" = list("rr", "rrr", "rrrr")
)
autohiss_exempt = list("Siik'tajr")
/datum/species/plasmaman
autohiss_basic_map = list(
"s" = list("ss", "sss", "ssss")
)
/datum/species/kidan
autohiss_basic_map = list(
"z" = list("zz", "zzz", "zzzz"),
"v" = list("vv", "vvv", "vvvv")
)
autohiss_extra_map = list(
"s" = list("z", "zs", "zzz", "zzsz")
)
autohiss_exempt = list("Chittin")
/datum/species/proc/handle_autohiss(message, datum/language/lang, mode)
if(!autohiss_basic_map)
return message
if(autohiss_exempt && (lang.name in autohiss_exempt))
return message
var/map = autohiss_basic_map.Copy()
if(mode == AUTOHISS_FULL && autohiss_extra_map)
map |= autohiss_extra_map
. = list()
while(length(message))
var/min_index = 10000 // if the message is longer than this, the autohiss is the least of your problems
var/min_char = null
for(var/char in map)
var/i = findtext(message, char)
if(!i) // no more of this character anywhere in the string, don't even bother searching next time
map -= char
else if(i < min_index)
min_index = i
min_char = char
if(!min_char) // we didn't find any of the mapping characters
. += message
break
. += copytext(message, 1, min_index)
if(copytext(message, min_index, min_index+1) == uppertext(min_char))
. += capitalize(pick(map[min_char]))
else
. += pick(map[min_char])
message = copytext(message, min_index + 1)
return list2text(.)
#undef AUTOHISS_OFF
#undef AUTOHISS_BASIC
#undef AUTOHISS_FULL
#undef AUTOHISS_NUM
@@ -143,7 +143,7 @@
var/t_state = r_hand.item_state
if(!t_state) t_state = r_hand.icon_state
r_hand.screen_loc = ui_rhand
overlays_standing[X_R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = t_state)
overlays_standing[X_R_HAND_LAYER] = image("icon" = r_hand.righthand_file, "icon_state" = t_state)
else
overlays_standing[X_R_HAND_LAYER] = null
if(update_icons) update_icons()
@@ -153,7 +153,7 @@
var/t_state = l_hand.item_state
if(!t_state) t_state = l_hand.icon_state
l_hand.screen_loc = ui_lhand
overlays_standing[X_L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = t_state)
overlays_standing[X_L_HAND_LAYER] = image("icon" = l_hand.lefthand_file, "icon_state" = t_state)
else
overlays_standing[X_L_HAND_LAYER] = null
if(update_icons) update_icons()
@@ -0,0 +1,128 @@
var/global/list/body_accessory_by_name = list("None" = null)
/hook/startup/proc/initalize_body_accessories()
// __init_body_accessory(/datum/body_accessory/body)
__init_body_accessory(/datum/body_accessory/tail)
if(body_accessory_by_name.len)
if(initialize_body_accessory_by_species())
return 1
return 0 //fail if no bodies are found
var/global/list/body_accessory_by_species = list("None" = null)
/proc/initialize_body_accessory_by_species()
for(var/B in body_accessory_by_name)
var/datum/body_accessory/accessory = body_accessory_by_name[B]
if(!istype(accessory)) continue
for(var/species in accessory.allowed_species)
if(!body_accessory_by_species["[species]"]) body_accessory_by_species["[species]"] = list()
body_accessory_by_species["[species]"] += accessory
if(body_accessory_by_species.len)
return 1
return 0
/proc/__init_body_accessory(var/ba_path)
if(ispath(ba_path))
var/_added_counter = 0
for(var/A in subtypesof(ba_path))
var/datum/body_accessory/B = new A
if(istype(B))
body_accessory_by_name[B.name] += B
++_added_counter
if(_added_counter)
return 1
return 0
/datum/body_accessory
var/name = "default"
var/icon = null
var/icon_state = ""
var/animated_icon = null
var/animated_icon_state = ""
var/blend_mode = null
var/pixel_x_offset = 0
var/pixel_y_offset = 0
var/list/allowed_species = list()
/datum/body_accessory/proc/try_restrictions(var/mob/living/carbon/human/H)
return 1
/datum/body_accessory/proc/get_animated_icon() //return animated if it has it, return static if it does not.
if(animated_icon)
return animated_icon
else return icon
/datum/body_accessory/proc/get_animated_icon_state()
if(animated_icon_state)
return animated_icon_state
else return icon_state
/*
//Bodies
/datum/body_accessory/body
blend_mode = ICON_MULTIPLY
/datum/body_accessory/body/snake
name = "Snake"
icon = 'icons/mob/body_accessory_64.dmi'
icon_state = "naga"
pixel_x_offset = -16*/
//Tails
/datum/body_accessory/tail
icon = 'icons/mob/body_accessory.dmi'
animated_icon = 'icons/mob/body_accessory.dmi'
blend_mode = ICON_ADD
/datum/body_accessory/tail/try_restrictions(var/mob/living/carbon/human/H)
if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL) && !istype(H.wear_suit, /obj/item/clothing/suit/space))
return 1
return 0
//vulpakin
/datum/body_accessory/tail/vulpkanin_2
name = "Vulpkanin Alt 1 (Bushy)"
icon_state = "vulptail2"
animated_icon_state = "vulptail2_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_3
name = "Vulpkanin Alt 2 (Straight)"
icon_state = "vulptail3"
animated_icon_state = "vulptail3_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_4
name = "Vulpkanin Alt 3 (Tiny)"
icon_state = "vulptail4"
animated_icon_state = "vulptail4_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_5
name = "Vulpkanin Alt 4 (Short)"
icon_state = "vulptail5"
animated_icon_state = "vulptail5_a"
allowed_species = list("Vulpkanin")
@@ -116,7 +116,12 @@
m_type = 1
if("wag")
if(species.bodyflags & TAIL_WAGGING)
if(body_accessory)
if(body_accessory.try_restrictions(src))
message = "<B>[src]</B> starts wagging \his tail."
start_tail_wagging(1)
else if(species.bodyflags & TAIL_WAGGING)
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
message = "<B>[src]</B> starts wagging \his tail."
src.start_tail_wagging(1)
@@ -126,7 +131,7 @@
return
if("swag")
if(species.bodyflags & TAIL_WAGGING)
if(species.bodyflags & TAIL_WAGGING || body_accessory)
message = "<B>[src]</B> stops wagging \his tail."
src.stop_tail_wagging(1)
else
@@ -1779,4 +1779,9 @@
if(I.body_parts_covered & HEAD)
prot["head"] = max(1 - I.permeability_coefficient, prot["head"])
var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7
return protection
return protection
/mob/living/carbon/human/proc/get_full_print()
if(!dna || !dna.uni_identity)
return
return md5(dna.uni_identity)
@@ -82,4 +82,6 @@
var/lastFart = 0 // Toxic fart cooldown.
var/fire_dmi = 'icons/mob/OnFire.dmi'
var/fire_sprite = "Standing"
var/fire_sprite = "Standing"
var/datum/body_accessory/body_accessory = null
+85 -182
View File
@@ -1,152 +1,10 @@
/mob/living/carbon/human/say(var/message)
var/verb = "says"
var/alt_name = ""
var/message_range = world.view
var/italics = 0
if(client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (Muted)."
return
message = trim_strip_html_properly(message)
if(stat)
if(stat == 2)
return say_dead(message)
return
if (is_muzzled())
src << "<span class='danger'>You're muzzled and cannot speak!</span>"
return
var/message_mode = parse_message_mode(message, "headset")
if(copytext(message,1,2) == "*")
return emote(copytext(message,2))
if(name != GetVoice())
alt_name = " (as [get_id_name("Unknown")])"
//parse the radio code and consume it
if (message_mode)
if (message_mode == "headset")
message = copytext(message,2) //it would be really nice if the parse procs could do this for us.
else
message = copytext(message,3)
//parse the language code and consume it
var/datum/language/speaking = parse_language(message)
if(speaking)
message = copytext(message,2+length(speaking.key))
else
speaking = get_default_language()
var/ending = copytext(message, length(message))
if (speaking)
// This is broadcast to all mobs with the language,
// irrespective of distance or anything else.
if(speaking.flags & HIVEMIND)
speaking.broadcast(src,trim(message))
return
//If we've gotten this far, keep going!
verb = speaking.get_spoken_verb(ending)
else
if(ending=="!")
verb=pick("exclaims","shouts","yells")
if(ending=="?")
verb="asks"
message = trim(message)
if(speech_problem_flag)
var/list/handle_r = handle_speech_problems(message)
message = handle_r[1]
verb = handle_r[2]
speech_problem_flag = handle_r[3]
if(!message || message == "")
return
var/list/obj/item/used_radios = new
switch (message_mode)
if("headset")
if(l_ear && istype(l_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = l_ear
R.talk_into(src,message,null,verb,speaking)
used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = r_ear
R.talk_into(src,message,null,verb,speaking)
used_radios += r_ear
if("right ear")
var/obj/item/device/radio/R
var/has_radio = 0
if(r_ear && istype(r_ear,/obj/item/device/radio))
R = r_ear
has_radio = 1
if(r_hand && istype(r_hand, /obj/item/device/radio))
R = r_hand
has_radio = 1
if(has_radio)
R.talk_into(src,message,null,verb,speaking)
used_radios += R
if("left ear")
var/obj/item/device/radio/R
var/has_radio = 0
if(l_ear && istype(l_ear,/obj/item/device/radio))
R = l_ear
has_radio = 1
if(l_hand && istype(l_hand,/obj/item/device/radio))
R = l_hand
has_radio = 1
if(has_radio)
R.talk_into(src,message,null,verb,speaking)
used_radios += R
if("intercom")
for(var/obj/item/device/radio/intercom/I in view(1, null))
I.talk_into(src, message, verb, speaking)
used_radios += I
if("whisper")
whisper_say(message, speaking, alt_name)
return
else
if(message_mode)
if(l_ear && istype(l_ear,/obj/item/device/radio))
l_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio))
r_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += r_ear
var/sound/speech_sound
var/sound_vol
if(species.speech_sounds && prob(species.speech_chance))
speech_sound = sound(pick(species.speech_sounds))
sound_vol = 50
//speaking into radios
if(used_radios.len)
italics = 1
message_range = 1
if(speaking)
message_range = speaking.get_talkinto_msg_range(message)
var/msg
if(!speaking || !(speaking.flags & NO_TALK_MSG))
msg = "<span class='notice'>\The [src] talks into \the [used_radios[1]]</span>"
for(var/mob/living/M in hearers(5, src))
if((M != src) && msg)
M.show_message(msg)
if (speech_sound)
sound_vol *= 0.5
..(message, speaking, verb, alt_name, italics, message_range, speech_sound, sound_vol) //ohgod we should really be passing a datum here.
..(message, alt_name = alt_name) //ohgod we should really be passing a datum here.
/mob/living/carbon/human/proc/forcesay(list/append)
if(stat == CONSCIOUS)
@@ -207,7 +65,7 @@
// return 0
return ..()
/mob/living/carbon/human/proc/HasVoiceChanger()
for(var/obj/item/gear in list(wear_mask,wear_suit,head))
if(!gear)
@@ -216,7 +74,7 @@
if(changer && changer.active && changer.voice)
return changer.voice
return 0
/mob/living/carbon/human/GetVoice()
var/has_changer = HasVoiceChanger()
if(has_changer)
@@ -240,15 +98,6 @@
return special_voice
/*
***Deprecated***
let this be handled at the hear_say or hear_radio proc
This is left in for robot speaking when humans gain binary channel access until I get around to rewriting
robot_talk() proc.
There is no language handling build into it however there is at the /mob level so we accept the call
for it but just ignore it.
*/
/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null)
var/verb = "says"
var/ending = copytext(message, length(message))
@@ -257,27 +106,27 @@
verb = speaking.get_spoken_verb(ending)
else
if(ending == "!")
verb = "exclaims"
else if(ending == "?")
verb = "asks"
return pick("exclaims", "shouts", "yells")
if(ending == "?")
return "asks"
return verb
/mob/living/carbon/human/proc/handle_speech_problems(var/message)
/mob/living/carbon/human/handle_speech_problems(var/message, var/verb)
var/list/returns[3]
var/verb = "says"
var/handled = 0
var/speech_problem_flag = 0
if(silent || (sdisabilities & MUTE))
message = ""
handled = 1
speech_problem_flag = 1
if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
if(hoers.voicechange)
if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling")
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
verb = pick("whinnies","neighs", "says")
handled = 1
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
verb = pick("whinnies","neighs", "says")
speech_problem_flag = 1
if(dna)
for(var/datum/dna/gene/gene in dna_genes)
@@ -285,25 +134,18 @@
continue
if(gene.is_active(src))
message = gene.OnSay(src,message)
handled = 1
speech_problem_flag = 1
if(message != "")
if((HULK in mutations) && health >= 25 && length(message))
message = "[uppertext(message)]!!!"
verb = pick("yells","roars","hollers")
handled = 1
if(slurring)
message = slur(message)
verb = "slurs"
handled = 1
if(stuttering)
message = stutter(message)
verb = "stammers"
handled = 1
var/list/parent = ..()
message = parent[1]
verb = parent[2]
if(parent[3])
speech_problem_flag = 1
var/braindam = getBrainLoss()
if(braindam >= 60)
handled = 1
speech_problem_flag = 1
if(prob(braindam/4))
message = stutter(message)
verb = "gibbers"
@@ -311,9 +153,70 @@
message = uppertext(message)
verb = "yells loudly"
if(COMIC in mutations)
message = "<span class='sans'>[message]</span>"
returns[1] = message
returns[2] = verb
returns[3] = handled
returns[3] = speech_problem_flag
return returns
/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
switch(message_mode)
if("intercom")
for(var/obj/item/device/radio/intercom/I in view(1, null))
I.talk_into(src, message, verb, speaking)
used_radios += I
if("headset")
if(l_ear && istype(l_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = l_ear
R.talk_into(src,message,null,verb,speaking)
used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio))
var/obj/item/device/radio/R = r_ear
R.talk_into(src,message,null,verb,speaking)
used_radios += r_ear
if("right ear")
var/obj/item/device/radio/R
var/has_radio = 0
if(r_ear && istype(r_ear,/obj/item/device/radio))
R = r_ear
has_radio = 1
if(r_hand && istype(r_hand, /obj/item/device/radio))
R = r_hand
has_radio = 1
if(has_radio)
R.talk_into(src,message,null,verb,speaking)
used_radios += R
if("left ear")
var/obj/item/device/radio/R
var/has_radio = 0
if(l_ear && istype(l_ear,/obj/item/device/radio))
R = l_ear
has_radio = 1
if(l_hand && istype(l_hand,/obj/item/device/radio))
R = l_hand
has_radio = 1
if(has_radio)
R.talk_into(src,message,null,verb,speaking)
used_radios += R
if("whisper")
whisper_say(message, speaking, alt_name)
return 1
else
if(message_mode)
if(l_ear && istype(l_ear,/obj/item/device/radio))
l_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += l_ear
else if(r_ear && istype(r_ear,/obj/item/device/radio))
r_ear.talk_into(src,message, message_mode, verb, speaking)
used_radios += r_ear
/mob/living/carbon/human/handle_speech_sound()
var/list/returns[2]
if(species.speech_sounds && prob(species.speech_chance))
returns[1] = sound(pick(species.speech_sounds))
returns[2] = 50
return returns
@@ -35,7 +35,8 @@
"antennae" = /obj/item/organ/wryn/hivenode
)
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
reagent_tag = PROCESS_ORG
@@ -61,6 +61,7 @@
var/has_fine_manipulation = 1 // Can use small items.
var/flags = 0 // Various specific features.
var/clothing_flags = 0 // Underwear and socks.
var/bloodflags = 0
var/bodyflags = 0
var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods
@@ -6,7 +6,8 @@
primitive_form = "Monkey"
path = /mob/living/carbon/human/human
language = "Sol Common"
flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_TONE
dietflags = DIET_OMNI
unarmed_type = /datum/unarmed_attack/punch
@@ -37,7 +38,8 @@
else, frequently even their own lives. They prefer warmer temperatures than most species and \
their native tongue is a heavy hissing laungage called Sinta'Unathi."
flags = HAS_LIPS | HAS_UNDERWEAR
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_CARN
@@ -88,7 +90,8 @@
primitive_form = "Farwa"
flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
@@ -119,7 +122,8 @@
to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \
which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
flags = HAS_LIPS | HAS_UNDERWEAR
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
@@ -148,7 +152,8 @@
herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
the secrets of their empire to their allies."
flags = HAS_LIPS | HAS_UNDERWEAR
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR
dietflags = DIET_HERB
@@ -190,6 +195,7 @@
poison_type = "oxygen"
flags = NO_SCAN | IS_WHITELISTED
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
blood_color = "#2299FC"
@@ -278,6 +284,7 @@
brute_mod = 0.8
flags = IS_WHITELISTED
clothing_flags = HAS_SOCKS
bodyflags = FEET_CLAWS
dietflags = DIET_HERB
@@ -295,6 +302,7 @@
unarmed_type = /datum/unarmed_attack/punch
flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
clothing_flags = HAS_SOCKS
bodyflags = HAS_SKIN_COLOR
bloodflags = BLOOD_SLIME
dietflags = DIET_CARN
@@ -322,7 +330,8 @@
default_genes = list(REMOTE_TALK)
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_HERB
reagent_tag = PROCESS_ORG
@@ -373,6 +382,7 @@
water and other radiation."
flags = NO_BREATHE | REQUIRE_LIGHT | IS_PLANT | RAD_ABSORB | NO_BLOOD | NO_PAIN
clothing_flags = HAS_SOCKS
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
@@ -467,6 +477,7 @@
passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD
clothing_flags = HAS_SOCKS
dietflags = 0 //IPCs can't eat, so no diet
blood_color = "#1F181F"
flesh_color = "#AAAAAA"
@@ -317,18 +317,18 @@ var/global/list/damage_icon_parts = list()
stand_icon.Blend(base_icon,ICON_OVERLAY)
//Underwear
if(underwear && species.flags & HAS_UNDERWEAR)
if(underwear && species.clothing_flags & HAS_UNDERWEAR)
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
if(U)
stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY)
if(undershirt && species.flags & HAS_UNDERWEAR)
if(undershirt && species.clothing_flags & HAS_UNDERSHIRT)
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt]
if(U2)
stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
if(socks)
if(socks && species.clothing_flags & HAS_SOCKS)
var/datum/sprite_accessory/socks/U3 = socks_list[socks]
if(U3)
stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY)
@@ -344,7 +344,7 @@ var/global/list/damage_icon_parts = list()
stand_icon.Blend(lips, ICON_OVERLAY)
//tail
update_tail_showing(0)
update_tail_layer(0)
//HAIR OVERLAY
@@ -763,12 +763,12 @@ var/global/list/damage_icon_parts = list()
overlays_standing[SUIT_LAYER] = standing
update_tail_showing(0)
update_tail_layer(0)
else
overlays_standing[SUIT_LAYER] = null
update_tail_showing(0)
update_tail_layer(0)
update_collar(0)
@@ -868,15 +868,10 @@ var/global/list/damage_icon_parts = list()
var/t_state = r_hand.item_state
if(!t_state) t_state = r_hand.icon_state
if(r_hand.icon_override)
t_state = "[t_state]_r"
overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.icon_override, "icon_state" = "[t_state]")
else if(r_hand.sprite_sheets && r_hand.sprite_sheets[species.name])
t_state = "[t_state]_r"
overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.sprite_sheets[species.name], "icon_state" = "[t_state]")
else
overlays_standing[R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = "[t_state]")
var/image/I = image("icon" = r_hand.righthand_file, "icon_state"="[t_state]", "layer"=-R_HAND_LAYER)
I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension)
overlays_standing[R_HAND_LAYER] = I
if (handcuffed) drop_r_hand()
else
overlays_standing[R_HAND_LAYER] = null
@@ -889,24 +884,29 @@ var/global/list/damage_icon_parts = list()
var/t_state = l_hand.item_state
if(!t_state) t_state = l_hand.icon_state
if(l_hand.icon_override)
t_state = "[t_state]_l"
overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.icon_override, "icon_state" = "[t_state]")
else if(l_hand.sprite_sheets && l_hand.sprite_sheets[species.name])
t_state = "[t_state]_l"
overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.sprite_sheets[species.name], "icon_state" = "[t_state]")
else
overlays_standing[L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = "[t_state]")
var/image/I = image("icon" = l_hand.lefthand_file, "icon_state"="[t_state]", "layer"=-L_HAND_LAYER)
I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension)
overlays_standing[L_HAND_LAYER] = I
if (handcuffed) drop_l_hand()
else
overlays_standing[L_HAND_LAYER] = null
if(update_icons) update_icons()
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1)
overlays_standing[TAIL_LAYER] = null
if(species.tail && species.bodyflags & HAS_TAIL)
if(body_accessory)
if(body_accessory.try_restrictions(src))
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
@@ -920,7 +920,13 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1)
overlays_standing[TAIL_LAYER] = null
if(species.tail && species.bodyflags & HAS_TAIL)
if(body_accessory)
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL)
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s")
tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
@@ -932,14 +938,11 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/stop_tail_wagging(var/update_icons=1)
overlays_standing[TAIL_LAYER] = null
if(species.tail && species.bodyflags & HAS_TAIL)
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
update_tail_layer(update_icons) //just trigger a full update for normal stationary sprites
overlays_standing[TAIL_LAYER] = image(tail_s)
if(update_icons)
update_icons()
/mob/living/carbon/human/handle_transform_change()
..()
update_tail_layer()
//Adds a collar overlay above the helmet layer if the suit has one
// Suit needs an identically named sprite in icons/mob/collar.dmi
+11 -11
View File
@@ -141,26 +141,26 @@
loc_temp = loc:air_contents.temperature
else
loc_temp = environment.temperature
if(loc_temp < 310.15) // a cold place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
else // a hot place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
//Account for massive pressure differences
if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc
if(bodytemperature <= (T0C - 40)) // stun temperature
Tempstun = 1
if(bodytemperature <= (T0C - 50)) // hurt temperature
if(bodytemperature <= 50) // sqrting negative numbers is bad
adjustToxLoss(200)
else
adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults),
else //so the ToxLoss needs to be 300 or above to guarrantee an instant death
adjustToxLoss(round(sqrt(bodytemperature)) * 2)
else
Tempstun = 0
/*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/
if(loc_temp < 310.15) // a cold place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
else // a hot place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
updatehealth()
@@ -215,7 +215,7 @@
if(src.stat != DEAD)
src.stat = UNCONSCIOUS
if(prob(30))
if(prob(30)) //I think this is meant to allow slimes to starve to death
adjustOxyLoss(-1)
adjustToxLoss(-1)
adjustFireLoss(-1)
@@ -28,4 +28,8 @@
if(changed)
animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT)
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
handle_transform_change()
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life().
/mob/living/carbon/proc/handle_transform_change()
return
+119 -1
View File
@@ -67,7 +67,125 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/proc/get_default_language()
return default_language
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/sound/speech_sound, var/sound_vol)
/mob/living/proc/handle_speech_problems(var/message, var/verb)
var/list/returns[3]
var/speech_problem_flag = 0
if((HULK in mutations) && health >= 25 && length(message))
message = "[uppertext(message)]!!!"
verb = pick("yells","roars","hollers")
speech_problem_flag = 1
if(COMIC in mutations)
message = "<span class='sans'>[message]</span>"
if(slurring)
message = slur(message)
verb = "slurs"
speech_problem_flag = 1
if(stuttering)
message = stutter(message)
verb = "stammers"
speech_problem_flag = 1
returns[1] = message
returns[2] = verb
returns[3] = speech_problem_flag
return returns
/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
return 0
/mob/living/proc/handle_speech_sound()
var/list/returns[2]
returns[1] = null
returns[2] = null
return returns
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name="")
if(client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (Muted)."
return
message = trim_strip_html_properly(message)
if(stat)
if(stat == 2)
return say_dead(message)
return
var/message_mode = parse_message_mode(message, "headset")
if(copytext(message,1,2) == "*")
return emote(copytext(message,2))
//parse the radio code and consume it
if (message_mode)
if (message_mode == "headset")
message = copytext(message,2) //it would be really nice if the parse procs could do this for us.
else
message = copytext(message,3)
message = trim_left(message)
//parse the language code and consume it
if(!speaking)
speaking = parse_language(message)
if(speaking)
message = copytext(message, 2 + length(speaking.key))
else
speaking = get_default_language()
// This is broadcast to all mobs with the language,
// irrespective of distance or anything else.
if(speaking && (speaking.flags & HIVEMIND))
speaking.broadcast(src,trim(message))
return 1
verb = say_quote(message, speaking)
if(is_muzzled())
src << "<span class='danger'>You're muzzled and cannot speak!</span>"
return
message = trim_left(message)
message = handle_autohiss(message, speaking)
var/list/handle_s = handle_speech_problems(message, verb)
message = handle_s[1]
verb = handle_s[2]
if(!message || message == "")
return 0
var/list/obj/item/used_radios = new
if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name))
return 1
var/list/handle_v = handle_speech_sound()
var/sound/speech_sound = handle_v[1]
var/sound_vol = handle_v[2]
var/italics = 0
var/message_range = world.view
//speaking into radios
if(used_radios.len)
italics = 1
message_range = 1
if(speaking)
message_range = speaking.get_talkinto_msg_range(message)
var/msg
if(!speaking || !(speaking.flags & NO_TALK_MSG))
msg = "<span class='notice'>\The [src] talks into \the [used_radios[1]]</span>"
for(var/mob/living/M in hearers(5, src))
if((M != src) && msg)
M.show_message(msg)
if (speech_sound)
sound_vol *= 0.5
var/turf/T = get_turf(src)
+15 -7
View File
@@ -538,7 +538,6 @@
return
H.icon_state = "pai-[icon_state]"
H.item_state = "pai-[icon_state]"
H.icon_override = 'icons/mob/in-hand/paiheld.dmi'//I have these in diffrent DMI so i am overriding
grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work
grabber.update_inv_l_hand()
grabber.update_inv_r_hand()
@@ -546,13 +545,22 @@
return H
/mob/living/silicon/pai/MouseDrop(atom/over_object)
var/mob/living/carbon/H = over_object
if(!istype(H) || !Adjacent(H)) return ..()
if(H.a_intent == I_HELP)
get_scooped(H)
//return
var/mob/living/carbon/human/H = over_object //changed to human to avoid stupid issues like xenos holding pAIs.
if(!istype(H) || !Adjacent(H)) return ..()
if(usr == src)
switch(alert(H, "[src] wants you to pick them up. Do it?",,"Yes","No"))
if("Yes")
if(Adjacent(H))
get_scooped(H)
else
src << "<span class='warning'>You need to stay in reaching distance to be picked up.</span>"
if("No")
src << "<span class='warning'>[H] decided not to pick you up.</span>"
else
return ..()
if(Adjacent(H))
get_scooped(H)
else
return ..()
/mob/living/silicon/pai/on_forcemove(atom/newloc)
if(card)
@@ -0,0 +1,40 @@
/mob/living/silicon/robot/drone/say(var/message)
if(local_transmit)
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "You cannot send IC messages (muted)."
return 0
if (src.client.handle_spam_prevention(message,MUTE_IC))
return 0
message = sanitize(message)
if (stat == 2)
return say_dead(message)
if(copytext(message,1,2) == "*")
return emote(copytext(message,2))
if(copytext(message,1,2) == ";")
var/datum/language/L = all_languages["Drone Talk"]
if(istype(L))
return L.broadcast(src,trim(copytext(message,2)))
//Must be concious to speak
if (stat)
return 0
var/list/listeners = hearers(5,src)
listeners |= src
for(var/mob/living/silicon/D in listeners)
if(D.client && D.local_transmit)
D << "<b>[src]</b> transmits, \"[message]\""
for (var/mob/M in player_list)
if (istype(M, /mob/new_player))
continue
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
if(M.client) M << "<b>[src]</b> transmits, \"[message]\""
return 1
return ..(message, 0)

Some files were not shown because too many files have changed in this diff Show More