Merge remote-tracking branch 'upstream/dev' into faxmachine

This commit is contained in:
mwerezak
2014-10-15 21:12:21 -04:00
95 changed files with 1211 additions and 1040 deletions

View File

@@ -26,7 +26,6 @@
G.assailant = src G.assailant = src
G.layer = 20 G.layer = 20
G.affecting = target G.affecting = target
target.grabbed_by += G
G.synch() G.synch()
target.LAssailant = src target.LAssailant = src

View File

@@ -95,7 +95,6 @@
M.r_hand = G M.r_hand = G
G.layer = 20 G.layer = 20
G.affecting = src G.affecting = src
grabbed_by += G
G.synch() G.synch()
LAssailant = M LAssailant = M
@@ -150,7 +149,6 @@
M.r_hand = G M.r_hand = G
G.layer = 20 G.layer = 20
G.affecting = src G.affecting = src
grabbed_by += G
G.synch() G.synch()
LAssailant = M LAssailant = M

View File

@@ -47,7 +47,7 @@ turf/c_airblock(turf/other)
#ifdef ZASDBG #ifdef ZASDBG
ASSERT(isturf(other)) ASSERT(isturf(other))
#endif #endif
if(blocks_air) if(blocks_air || other.blocks_air)
return BLOCKED return BLOCKED
//Z-level handling code. Always block if there isn't an open space. //Z-level handling code. Always block if there isn't an open space.

View File

@@ -76,11 +76,15 @@ Class Procs:
edge.add_connection(src) edge.add_connection(src)
/connection/proc/mark_direct() /connection/proc/mark_direct()
if(!direct())
state |= CONNECTION_DIRECT state |= CONNECTION_DIRECT
edge.direct++
//world << "Marked direct." //world << "Marked direct."
/connection/proc/mark_indirect() /connection/proc/mark_indirect()
if(direct())
state &= ~CONNECTION_DIRECT state &= ~CONNECTION_DIRECT
edge.direct--
//world << "Marked indirect." //world << "Marked indirect."
/connection/proc/mark_space() /connection/proc/mark_space()
@@ -110,7 +114,6 @@ Class Procs:
erase() erase()
return return
else if(block_status & ZONE_BLOCKED) else if(block_status & ZONE_BLOCKED)
if(direct())
mark_indirect() mark_indirect()
else else
mark_direct() mark_direct()

View File

@@ -61,6 +61,7 @@ Class Procs:
/connection_edge/var/zone/A /connection_edge/var/zone/A
/connection_edge/var/list/connecting_turfs = list() /connection_edge/var/list/connecting_turfs = list()
/connection_edge/var/direct = 0
/connection_edge/var/coefficient = 0 /connection_edge/var/coefficient = 0
@@ -69,6 +70,7 @@ Class Procs:
/connection_edge/proc/add_connection(connection/c) /connection_edge/proc/add_connection(connection/c)
coefficient++ coefficient++
if(c.direct()) direct++
//world << "Connection added: [type] Coefficient: [coefficient]" //world << "Connection added: [type] Coefficient: [coefficient]"
/connection_edge/proc/remove_connection(connection/c) /connection_edge/proc/remove_connection(connection/c)
@@ -76,6 +78,7 @@ Class Procs:
coefficient-- coefficient--
if(coefficient <= 0) if(coefficient <= 0)
erase() erase()
if(c.direct()) direct--
/connection_edge/proc/contains_zone(zone/Z) /connection_edge/proc/contains_zone(zone/Z)
@@ -114,7 +117,6 @@ Class Procs:
/connection_edge/zone/var/zone/B /connection_edge/zone/var/zone/B
/connection_edge/zone/var/direct = 0
/connection_edge/zone/New(zone/A, zone/B) /connection_edge/zone/New(zone/A, zone/B)
@@ -128,11 +130,9 @@ Class Procs:
/connection_edge/zone/add_connection(connection/c) /connection_edge/zone/add_connection(connection/c)
. = ..() . = ..()
connecting_turfs.Add(c.A) connecting_turfs.Add(c.A)
if(c.direct()) direct++
/connection_edge/zone/remove_connection(connection/c) /connection_edge/zone/remove_connection(connection/c)
connecting_turfs.Remove(c.A) connecting_turfs.Remove(c.A)
if(c.direct()) direct--
. = ..() . = ..()
/connection_edge/zone/contains_zone(zone/Z) /connection_edge/zone/contains_zone(zone/Z)

View File

@@ -116,7 +116,7 @@
if(!resolved && A && W) if(!resolved && A && W)
W.afterattack(A,src,1,params) // 1 indicates adjacency W.afterattack(A,src,1,params) // 1 indicates adjacency
else else
UnarmedAttack(A) UnarmedAttack(A, 1)
return return
if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that

View File

@@ -247,6 +247,7 @@
mymob.internals.icon_state = "internal0" mymob.internals.icon_state = "internal0"
mymob.internals.name = "internal" mymob.internals.name = "internal"
mymob.internals.screen_loc = ui_internal mymob.internals.screen_loc = ui_internal
hud_elements |= mymob.internals
if(hud_data.has_warnings) if(hud_data.has_warnings)
mymob.oxygen = new /obj/screen() mymob.oxygen = new /obj/screen()

View File

@@ -70,6 +70,8 @@
var/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... var/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds...
var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. var/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active.
var/character_slots = 10 // The number of available character slots
var/max_maint_drones = 5 //This many drones can spawn, var/max_maint_drones = 5 //This many drones can spawn,
var/allow_drone_spawn = 1 //assuming the admin allow them to. var/allow_drone_spawn = 1 //assuming the admin allow them to.
var/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. var/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes.
@@ -494,6 +496,9 @@
if("req_cult_ghostwriter") if("req_cult_ghostwriter")
config.cult_ghostwriter_req_cultists = text2num(value) config.cult_ghostwriter_req_cultists = text2num(value)
if("character_slots")
config.character_slots = text2num(value)
if("allow_drone_spawn") if("allow_drone_spawn")
config.allow_drone_spawn = text2num(value) config.allow_drone_spawn = text2num(value)

View File

@@ -121,9 +121,6 @@ datum/controller/game_controller/proc/setup_objects()
//Set up spawn points. //Set up spawn points.
populate_spawn_points() populate_spawn_points()
//Set up gear list.
populate_gear_list()
//Set up roundstart seed list. //Set up roundstart seed list.
populate_seed_list() populate_seed_list()

View File

@@ -23,9 +23,6 @@
src.cure() src.cure()
if(stage == 1) if(stage == 1)
if(affected_mob.op_stage.appendix == 2.0)
// appendix is removed, can't get infected again
src.cure()
if(prob(5)) if(prob(5))
affected_mob << "\red You feel a stinging pain in your abdomen!" affected_mob << "\red You feel a stinging pain in your abdomen!"
affected_mob.emote("me",1,"winces slightly.") affected_mob.emote("me",1,"winces slightly.")
@@ -48,7 +45,6 @@
var/mob/living/carbon/human/H = affected_mob var/mob/living/carbon/human/H = affected_mob
H << "\red Your abdomen is a world of pain!" H << "\red Your abdomen is a world of pain!"
H.Weaken(10) H.Weaken(10)
H.op_stage.appendix = 2.0
var/datum/organ/external/groin = H.get_organ("groin") var/datum/organ/external/groin = H.get_organ("groin")
var/datum/wound/W = new /datum/wound/internal_bleeding(20) var/datum/wound/W = new /datum/wound/internal_bleeding(20)

View File

@@ -1,6 +1,5 @@
/var/datum/announcement/priority/priority_announcement = new(do_log = 0) /var/datum/announcement/priority/priority_announcement = new(do_log = 0)
/var/datum/announcement/priority/command/command_announcement = new(do_log = 0, do_newscast = 1) /var/datum/announcement/priority/command/command_announcement = new(do_log = 0, do_newscast = 1)
/var/datum/announcement/priority/security/security_announcement = new(do_log = 0, do_newscast = 1)
/datum/announcement /datum/announcement
var/title = "Attention" var/title = "Attention"
@@ -16,17 +15,17 @@
log = do_log log = do_log
newscast = do_newscast newscast = do_newscast
/datum/announcement/priority/New(var/do_log = 1, var/new_sound = sound('sound/items/AirHorn.ogg'), var/do_newscast = 0) /datum/announcement/priority/New(var/do_log = 1, var/new_sound = sound('sound/misc/notice2.ogg'), var/do_newscast = 0)
..(do_log, new_sound, do_newscast) ..(do_log, new_sound, do_newscast)
title = "Priority Announcement" title = "Priority Announcement"
announcement_type = "Priority Announcement" announcement_type = "Priority Announcement"
/datum/announcement/priority/command/New(var/do_log = 1, var/new_sound = sound('sound/items/AirHorn.ogg'), var/do_newscast = 0) /datum/announcement/priority/command/New(var/do_log = 1, var/new_sound = sound('sound/misc/notice2.ogg'), var/do_newscast = 0)
..(do_log, new_sound, do_newscast) ..(do_log, new_sound, do_newscast)
title = "[command_name()] Update" title = "[command_name()] Update"
announcement_type = "[command_name()] Update" announcement_type = "[command_name()] Update"
/datum/announcement/priority/security/New(var/do_log = 1, var/new_sound = sound('sound/items/AirHorn.ogg'), var/do_newscast = 0) /datum/announcement/priority/security/New(var/do_log = 1, var/new_sound = sound('sound/misc/notice2.ogg'), var/do_newscast = 0)
..(do_log, new_sound, do_newscast) ..(do_log, new_sound, do_newscast)
title = "Security Announcement" title = "Security Announcement"
announcement_type = "Security Announcement" announcement_type = "Security Announcement"

View File

@@ -94,6 +94,7 @@ var/list/ghostteleportlocs = list()
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
/area/space /area/space
name = "\improper Space" name = "\improper Space"
icon_state = "space"
requires_power = 1 requires_power = 1
always_unpowered = 1 always_unpowered = 1
lighting_use_dynamic = 1 lighting_use_dynamic = 1
@@ -708,6 +709,10 @@ var/list/ghostteleportlocs = list()
name = "\improper EVA Maintenance" name = "\improper EVA Maintenance"
icon_state = "maint_eva" icon_state = "maint_eva"
/area/maintenance/dormitory
name = "Dormitory Maintenance"
icon_state = "maint_dormitory"
/area/maintenance/incinerator /area/maintenance/incinerator
name = "\improper Incinerator" name = "\improper Incinerator"
icon_state = "disposal" icon_state = "disposal"
@@ -720,13 +725,17 @@ var/list/ghostteleportlocs = list()
name = "Medbay Maintenance" name = "Medbay Maintenance"
icon_state = "maint_medbay" icon_state = "maint_medbay"
/area/maintenance/misc_research /area/maintenance/research_port
name = "Misc. Research Maintenance" name = "Port Research Maintenance"
icon_state = "maint_misc_research" icon_state = "maint_research_port"
/area/maintenance/research_starboard
name = "Starboard Research Maintenance"
icon_state = "maint_research_starboard"
/area/maintenance/research_shuttle /area/maintenance/research_shuttle
name = "Research Shuttle Dock Maintenance" name = "Research Shuttle Dock Maintenance"
icon_state = "maint_r_shuttle" icon_state = "maint_research_shuttle"
/area/maintenance/security_port /area/maintenance/security_port
name = "Port Security Maintenance" name = "Port Security Maintenance"
@@ -740,14 +749,6 @@ var/list/ghostteleportlocs = list()
name = "Atmospherics" name = "Atmospherics"
icon_state = "green" icon_state = "green"
/area/maintenance/virology
name = "Virology Maintenance"
icon_state = "maint_viro"
/area/maintenance/xeno
name = "Xeno Maintenance"
icon_state = "maint_xeno"
// SUBSTATIONS (Subtype of maint, that should let them serve as shielded area during radstorm) // SUBSTATIONS (Subtype of maint, that should let them serve as shielded area during radstorm)
/area/maintenance/substation /area/maintenance/substation

View File

@@ -32,7 +32,7 @@
M.mutations.Add(mutation) M.mutations.Add(mutation)
if(disability) if(disability)
M.disabilities|=disability M.disabilities|=disability
if(mutation) if(sdisability)
M.sdisabilities|=sdisability M.sdisabilities|=sdisability
if(activation_message) if(activation_message)
M << "\red [activation_message]" M << "\red [activation_message]"
@@ -43,9 +43,9 @@
if(mutation && (mutation in M.mutations)) if(mutation && (mutation in M.mutations))
M.mutations.Remove(mutation) M.mutations.Remove(mutation)
if(disability) if(disability)
M.disabilities-=disability M.disabilities &= (~disability)
if(mutation) if(sdisability)
M.sdisabilities-=sdisability M.sdisabilities &= (~sdisability)
if(deactivation_message) if(deactivation_message)
M << "\red [deactivation_message]" M << "\red [deactivation_message]"
else else

View File

@@ -415,7 +415,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
if(13) if(13)
directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff." directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff."
if(14) if(14)
var/xenorace = pick("Unathi","Tajaran", "Skrellian") var/xenorace = pick("Unathi","Tajara", "Skrell")
directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible." directive += "A group of [xenorace] radicals have been loyal supporters of the Spider Clan. Favor [xenorace] crew whenever possible."
if(15) if(15)
directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false." directive += "The Spider Clan has recently been accused of religious insensitivity. Attempt to speak with the Chaplain and prove these accusations false."

View File

@@ -6,7 +6,7 @@ datum/directive/terminations/alien_fraud
proc/is_alien(mob/M) proc/is_alien(mob/M)
var/species = M.get_species() var/species = M.get_species()
return species == "Tajaran" || species == "Unathi" return species == "Tajara" || species == "Unathi"
datum/directive/terminations/alien_fraud/get_crew_to_terminate() datum/directive/terminations/alien_fraud/get_crew_to_terminate()
var/list/aliens[0] var/list/aliens[0]
@@ -30,7 +30,7 @@ datum/directive/terminations/alien_fraud/meets_prerequisites()
var/unathi = 0 var/unathi = 0
for(var/mob/M in player_list) for(var/mob/M in player_list)
var/species = M.get_species() var/species = M.get_species()
if(species == "Tajaran") if(species == "Tajara")
tajarans++ tajarans++
if(species == "Unathi") if(species == "Unathi")
unathi++ unathi++

View File

@@ -28,7 +28,7 @@ datum/directive/tau_ceti_needs_women
var/list/aliens[0] var/list/aliens[0]
for(var/mob/M in get_crew_of_target_gender()) for(var/mob/M in get_crew_of_target_gender())
var/species = M.get_species() var/species = M.get_species()
if(species == "Tajaran" || species == "Unathi" || species == "Skrell") if(species == "Tajara" || species == "Unathi" || species == "Skrell")
aliens.Add(M) aliens.Add(M)
return aliens return aliens

View File

@@ -232,8 +232,8 @@ var/global/list/turf/synd_spawn = list()
switch(race) switch(race)
if("Unathi") if("Unathi")
new_suit.species_restricted = list("Unathi") new_suit.species_restricted = list("Unathi")
if("Tajaran") if("Tajara")
new_suit.species_restricted = list("Tajaran") new_suit.species_restricted = list("Tajara")
if("Skrell") if("Skrell")
new_suit.species_restricted = list("Skrell") new_suit.species_restricted = list("Skrell")

View File

@@ -480,7 +480,7 @@ var/global/datum/controller/occupations/job_master
//TODO: Generalize this by-species //TODO: Generalize this by-species
if(H.species) if(H.species)
if(H.species.name == "Tajaran" || H.species.name == "Unathi") if(H.species.name == "Tajara" || H.species.name == "Unathi")
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1)
else if(H.species.name == "Vox") else if(H.species.name == "Vox")
H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask)

View File

@@ -46,7 +46,6 @@ var/list/whitelist = list()
return 1 return 1
if(findtext(s,"[M.ckey] - All")) if(findtext(s,"[M.ckey] - All"))
return 1 return 1
return 0 return 0
#undef WHITELISTFILE #undef WHITELISTFILE

View File

@@ -311,6 +311,9 @@
M:reagents.add_reagent("inaprovaline", 5) M:reagents.add_reagent("inaprovaline", 5)
return return
proc/toggle_filter() proc/toggle_filter()
if(!src.occupant)
filtering = 0
return
if(filtering) if(filtering)
filtering = 0 filtering = 0
else else

View File

@@ -1310,6 +1310,11 @@ FIRE ALARM
user.visible_message("\red [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") user.visible_message("\red [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
else else
user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") user.visible_message("\red [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
else if (istype(W, /obj/item/weapon/wirecutters))
user.visible_message("\red [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
buildstage = 1
update_icon()
if(1) if(1)
if(istype(W, /obj/item/stack/cable_coil)) if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W var/obj/item/stack/cable_coil/C = W

View File

@@ -240,8 +240,6 @@ update_flag
nanomanager.update_uis(src) // Update all NanoUIs attached to src nanomanager.update_uis(src) // Update all NanoUIs attached to src
/obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob) /obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob)
return src.attack_hand(user) return src.attack_hand(user)

View File

@@ -120,7 +120,7 @@
user << "\blue Nothing happens." user << "\blue Nothing happens."
return return
else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) else if ((istype(W, /obj/item/device/analyzer)) && Adjacent(user))
visible_message("\red [user] has used [W] on \icon[icon]") visible_message("\red [user] has used [W] on \icon[icon]")
if(air_contents) if(air_contents)
var/pressure = air_contents.return_pressure() var/pressure = air_contents.return_pressure()

View File

@@ -5,6 +5,9 @@
desc = "It's a machine that grows replacement organs." desc = "It's a machine that grows replacement organs."
icon = 'icons/obj/surgery.dmi' icon = 'icons/obj/surgery.dmi'
anchored = 1
density = 1
icon_state = "bioprinter" icon_state = "bioprinter"
var/prints_prosthetics var/prints_prosthetics

View File

@@ -11,16 +11,16 @@
var/mode = 0.0 var/mode = 0.0
var/printing = null var/printing = null
proc/is_centcom() /obj/machinery/computer/card/proc/is_centcom()
return istype(src, /obj/machinery/computer/card/centcom) return 0
proc/is_authenticated() /obj/machinery/computer/card/proc/is_authenticated()
return scan ? check_access(scan) : 0 return scan ? check_access(scan) : 0
proc/get_target_rank() /obj/machinery/computer/card/proc/get_target_rank()
return modify && modify.assignment ? modify.assignment : "Unassigned" return modify && modify.assignment ? modify.assignment : "Unassigned"
proc/format_jobs(list/jobs) /obj/machinery/computer/card/proc/format_jobs(list/jobs)
var/list/formatted = list() var/list/formatted = list()
for(var/job in jobs) for(var/job in jobs)
formatted.Add(list(list( formatted.Add(list(list(
@@ -288,3 +288,7 @@
name = "CentCom Identification Computer" name = "CentCom Identification Computer"
circuit = "/obj/item/weapon/circuitboard/card/centcom" circuit = "/obj/item/weapon/circuitboard/card/centcom"
req_access = list(access_cent_captain) req_access = list(access_cent_captain)
/obj/machinery/computer/card/centcom/is_centcom()
return 1

View File

@@ -602,7 +602,7 @@
//Departments that the cycler can paint suits to look like. //Departments that the cycler can paint suits to look like.
var/list/departments = list("Engineering","Mining","Medical","Security","Atmos") var/list/departments = list("Engineering","Mining","Medical","Security","Atmos")
//Species that the suits can be configured to fit. //Species that the suits can be configured to fit.
var/list/species = list("Human","Skrell","Unathi","Tajaran") var/list/species = list("Human","Skrell","Unathi","Tajara")
var/target_department var/target_department
var/target_species var/target_species
@@ -622,35 +622,35 @@
model_text = "Engineering" model_text = "Engineering"
req_access = list(access_construction) req_access = list(access_construction)
departments = list("Engineering","Atmos") departments = list("Engineering","Atmos")
species = list("Human","Tajaran","Skrell","Unathi") //Add Unathi when sprites exist for their suits. species = list("Human","Tajara","Skrell","Unathi") //Add Unathi when sprites exist for their suits.
/obj/machinery/suit_cycler/mining /obj/machinery/suit_cycler/mining
name = "Mining suit cycler" name = "Mining suit cycler"
model_text = "Mining" model_text = "Mining"
req_access = list(access_mining) req_access = list(access_mining)
departments = list("Mining") departments = list("Mining")
species = list("Human","Tajaran","Skrell","Unathi") species = list("Human","Tajara","Skrell","Unathi")
/obj/machinery/suit_cycler/security /obj/machinery/suit_cycler/security
name = "Security suit cycler" name = "Security suit cycler"
model_text = "Security" model_text = "Security"
req_access = list(access_security) req_access = list(access_security)
departments = list("Security") departments = list("Security")
species = list("Human","Tajaran","Skrell","Unathi") species = list("Human","Tajara","Skrell","Unathi")
/obj/machinery/suit_cycler/medical /obj/machinery/suit_cycler/medical
name = "Medical suit cycler" name = "Medical suit cycler"
model_text = "Medical" model_text = "Medical"
req_access = list(access_medical) req_access = list(access_medical)
departments = list("Medical") departments = list("Medical")
species = list("Human","Tajaran","Skrell","Unathi") species = list("Human","Tajara","Skrell","Unathi")
/obj/machinery/suit_cycler/syndicate /obj/machinery/suit_cycler/syndicate
name = "Nonstandard suit cycler" name = "Nonstandard suit cycler"
model_text = "Nonstandard" model_text = "Nonstandard"
req_access = list(access_syndicate) req_access = list(access_syndicate)
departments = list("Mercenary") departments = list("Mercenary")
species = list("Human","Tajaran","Skrell","Unathi") species = list("Human","Tajara","Skrell","Unathi")
can_repair = 1 can_repair = 1
/obj/machinery/suit_cycler/attack_ai(mob/user as mob) /obj/machinery/suit_cycler/attack_ai(mob/user as mob)

View File

@@ -1136,16 +1136,13 @@
M.verbs -= /obj/mecha/proc/move_inside_passenger M.verbs -= /obj/mecha/proc/move_inside_passenger
/obj/item/mecha_parts/mecha_equipment/tool/passenger/get_equip_info() /obj/item/mecha_parts/mecha_equipment/tool/passenger/get_equip_info()
var/output = ..() return "[..()] <br />[occupant? "\[Occupant: [occupant]\]|" : ""]Exterior Hatch: <a href='?src=\ref[src];toggle_lock=1'>Toggle Lock</a>"
if(output)
var/temp = "<br />[occupant? "\[Occupant: [occupant]\]|" : ""]Exterior Hatch: <a href='?src=\ref[src];toggle_lock=1'>[door_locked? "Locked" : "Unlocked"]</a>"
return "[output] [temp]"
return
/obj/item/mecha_parts/mecha_equipment/tool/passenger/Topic(href,href_list) /obj/item/mecha_parts/mecha_equipment/tool/passenger/Topic(href,href_list)
..() ..()
if (href_list["toggle_lock"]) if (href_list["toggle_lock"])
door_locked = !door_locked door_locked = !door_locked
occupant_message("Passenger compartment hatch [door_locked? "locked" : "unlocked"].")
if (chassis) if (chassis)
chassis.visible_message("The hatch on \the [chassis] [door_locked? "locks" : "unlocks"].", "You hear something latching.") chassis.visible_message("The hatch on \the [chassis] [door_locked? "locks" : "unlocks"].", "You hear something latching.")
@@ -1201,5 +1198,3 @@
usr << "\red All of the passenger compartments are already occupied or locked!" usr << "\red All of the passenger compartments are already occupied or locked!"
if (0) if (0)
usr << "\red \The [src] doesn't have a passenger compartment." usr << "\red \The [src] doesn't have a passenger compartment."
/obj/mecha/proc/remove_passenger()

View File

@@ -1575,14 +1575,19 @@
var/pname = input(user, "Choose a passenger to forcibly remove.", "Forcibly Remove Passenger") as null|anything in passengers var/pname = input(user, "Choose a passenger to forcibly remove.", "Forcibly Remove Passenger") as null|anything in passengers
if (pname) if (!pname)
return
var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P = passengers[pname] var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P = passengers[pname]
var/mob/occupant = P.occupant var/mob/occupant = P.occupant
visible_message("\red [user] opens the hatch on \the [P] and removes [occupant]!") user.visible_message("\red [user] begins opening the hatch on \the [P]...", "\red You begin opening the hatch on \the [P]...")
if (!do_after(user, 40, needhand=0))
return
user.visible_message("\red [user] opens the hatch on \the [P] and removes [occupant]!", "\red You open the hatch on \the [P] and remove [occupant]!")
P.go_out() P.go_out()
P.log_message("[occupant] was removed.") P.log_message("[occupant] was removed.")
occupant_message("\red [occupant] was removed from \the [P] by [user]!")
return return
if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card")) if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card"))
if(!in_range(src, usr)) return if(!in_range(src, usr)) return

View File

@@ -44,7 +44,7 @@
/* Species-specific sprites, concept stolen from Paradise//vg/. /* Species-specific sprites, concept stolen from Paradise//vg/.
ex: ex:
sprite_sheets = list( sprite_sheets = list(
"Tajaran" = 'icons/cat/are/bad' "Tajara" = 'icons/cat/are/bad'
) )
If index term exists and icon_override is not set, this sprite sheet will be used. If index term exists and icon_override is not set, this sprite sheet will be used.
*/ */
@@ -261,6 +261,9 @@
//START HUMAN //START HUMAN
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
if(H.species && !(slot in H.species.hud.equip_slots))
return 0
switch(slot) switch(slot)
if(slot_l_hand) if(slot_l_hand)
if(H.l_hand) if(H.l_hand)

View File

@@ -69,4 +69,4 @@
/obj/item/device/modkit/tajaran /obj/item/device/modkit/tajaran
name = "tajaran hardsuit modification kit" name = "tajaran hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran." desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajaran."
target_species = "Tajaran" target_species = "Tajara"

View File

@@ -76,7 +76,7 @@
title+= "[R.title]" title+= "[R.title]"
title+= " ([R.req_amount] [src.singular_name]\s)" title+= " ([R.req_amount] [src.singular_name]\s)"
if (can_build) if (can_build)
t1 += text("<A href='?src=\ref[src];sublist=[recipes_sublist];make=[i]'>[title]</A> ") t1 += text("<A href='?src=\ref[src];sublist=[recipes_sublist];make=[i];multiplier=1'>[title]</A> ")
else else
t1 += text("[]", title) t1 += text("[]", title)
continue continue
@@ -112,7 +112,8 @@
recipes_list = srl.recipes recipes_list = srl.recipes
var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])] var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])]
var/multiplier = text2num(href_list["multiplier"]) var/multiplier = text2num(href_list["multiplier"])
if (!multiplier) multiplier = 1 if (!multiplier || (multiplier <= 0)) //href exploit protection
return
if (src.amount < R.req_amount*multiplier) if (src.amount < R.req_amount*multiplier)
if (R.req_amount*multiplier>1) if (R.req_amount*multiplier>1)
usr << "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!" usr << "\red You haven't got enough [src] to build \the [R.req_amount*multiplier] [R.title]\s!"

View File

@@ -31,6 +31,10 @@
if(1 to 4) overlays += "phoron-[phorontanks]" if(1 to 4) overlays += "phoron-[phorontanks]"
if(5 to INFINITY) overlays += "phoron-5" if(5 to INFINITY) overlays += "phoron-5"
/obj/structure/dispenser/attack_ai(mob/user as mob)
if(user.Adjacent(src))
return attack_hand(user)
..()
/obj/structure/dispenser/attack_hand(mob/user as mob) /obj/structure/dispenser/attack_hand(mob/user as mob)
user.set_machine(src) user.set_machine(src)

View File

@@ -14,7 +14,7 @@ var/global/vox_tick = 1
if(1) // Vox raider! if(1) // Vox raider!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit) equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head) equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/melee/telebaton(src), slot_belt) equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE. equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store) equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store)

View File

@@ -159,6 +159,7 @@
log_client_to_db() log_client_to_db()
send_resources() send_resources()
nanomanager.send_resources(src)
if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates.
winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold") winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold")

View File

@@ -20,8 +20,6 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"mutineer" = IS_MODE_COMPILED("mutiny"), // 13 "mutineer" = IS_MODE_COMPILED("mutiny"), // 13
) )
var/const/MAX_SAVE_SLOTS = 10
//used for alternate_option //used for alternate_option
#define GET_RANDOM_JOB 0 #define GET_RANDOM_JOB 0
#define BE_ASSISTANT 1 #define BE_ASSISTANT 1
@@ -277,15 +275,15 @@ datum/preferences
dat += "<br><b>Custom Loadout:</b> " dat += "<br><b>Custom Loadout:</b> "
var/total_cost = 0 var/total_cost = 0
if(isnull(gear) || !islist(gear)) gear = list() if(!islist(gear)) gear = list()
if(gear && gear.len) if(gear && gear.len)
dat += "<br>" dat += "<br>"
for(var/gear_name in gear) for(var/i = 1; i <= gear.len; i++)
if(gear_datums[gear_name]) var/datum/gear/G = gear_datums[gear[i]]
var/datum/gear/G = gear_datums[gear_name] if(G)
total_cost += G.cost total_cost += G.cost
dat += "[gear_name] <a href='byond://?src=\ref[user];preference=loadout;task=remove;gear=[gear_name]'>\[remove\]</a><br>" dat += "[gear[i]] ([G.cost] points) <a href='byond://?src=\ref[user];preference=loadout;task=remove;gear=[i]'>\[remove\]</a><br>"
dat += "<b>Used:</b> [total_cost] points." dat += "<b>Used:</b> [total_cost] points."
else else
@@ -294,7 +292,7 @@ datum/preferences
if(total_cost < MAX_GEAR_COST) if(total_cost < MAX_GEAR_COST)
dat += " <a href='byond://?src=\ref[user];preference=loadout;task=input'>\[add\]</a>" dat += " <a href='byond://?src=\ref[user];preference=loadout;task=input'>\[add\]</a>"
if(gear && gear.len) if(gear && gear.len)
dat += " <a href='byond://?src=\ref[user];preference=loadout;task=remove'>\[remove\]</a>" dat += " <a href='byond://?src=\ref[user];preference=loadout;task=clear'>\[clear\]</a>"
dat += "<br><br><b>Occupation Choices</b><br>" dat += "<br><br><b>Occupation Choices</b><br>"
dat += "\t<a href='?_src_=prefs;preference=job;task=menu'><b>Set Preferences</b></a><br>" dat += "\t<a href='?_src_=prefs;preference=job;task=menu'><b>Set Preferences</b></a><br>"
@@ -882,17 +880,17 @@ datum/preferences
total_cost += C.cost total_cost += C.cost
if(C && total_cost <= MAX_GEAR_COST) if(C && total_cost <= MAX_GEAR_COST)
gear += choice gear += choice
user << "\blue Added [choice] for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)." user << "<span class='notice'>Added \the '[choice]' for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining).</span>"
else else
user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points." user << "<span class='warning'>Adding \the '[choice]' will exceed the maximum loadout cost of [MAX_GEAR_COST] points.</span>"
else if(href_list["task"] == "remove") else if(href_list["task"] == "remove")
var/to_remove = href_list["gear"] var/i_remove = text2num(href_list["gear"])
if(!to_remove) return if(i_remove < 1 || i_remove > gear.len) return
for(var/gear_name in gear) gear.Cut(i_remove, i_remove + 1)
if(gear_name == to_remove)
gear -= gear_name else if(href_list["task"] == "clear")
break gear.Cut()
else if(href_list["preference"] == "flavor_text") else if(href_list["preference"] == "flavor_text")
switch(href_list["task"]) switch(href_list["task"])
@@ -1187,7 +1185,7 @@ datum/preferences
b_type = new_b_type b_type = new_b_type
if("hair") if("hair")
if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell") if(species == "Human" || species == "Unathi" || species == "Tajara" || species == "Skrell")
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as color|null var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as color|null
if(new_hair) if(new_hair)
r_hair = hex2num(copytext(new_hair, 2, 4)) r_hair = hex2num(copytext(new_hair, 2, 4))
@@ -1267,7 +1265,7 @@ datum/preferences
s_tone = 35 - max(min( round(new_s_tone), 220),1) s_tone = 35 - max(min( round(new_s_tone), 220),1)
if("skin") if("skin")
if(species == "Unathi" || species == "Tajaran" || species == "Skrell") if(species == "Unathi" || species == "Tajara" || species == "Skrell")
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null
if(new_skin) if(new_skin)
r_skin = hex2num(copytext(new_skin, 2, 4)) r_skin = hex2num(copytext(new_skin, 2, 4))
@@ -1622,7 +1620,7 @@ datum/preferences
if(S) if(S)
dat += "<b>Select a character slot to load</b><hr>" dat += "<b>Select a character slot to load</b><hr>"
var/name var/name
for(var/i=1, i<=MAX_SAVE_SLOTS, i++) for(var/i=1, i<= config.character_slots, i++)
S.cd = "/character[i]" S.cd = "/character[i]"
S["real_name"] >> name S["real_name"] >> name
if(!name) name = "Character[i]" if(!name) name = "Character[i]"

View File

@@ -1,9 +1,10 @@
var/global/list/gear_datums = list() var/global/list/gear_datums = list()
proc/populate_gear_list() /hook/startup/proc/populate_gear_list()
for(var/type in typesof(/datum/gear)-/datum/gear) for(var/type in typesof(/datum/gear)-/datum/gear)
var/datum/gear/G = new type() var/datum/gear/G = new type()
gear_datums[G.display_name] = G gear_datums[G.display_name] = G
return 1
/datum/gear /datum/gear
var/display_name //Name/index. var/display_name //Name/index.
@@ -176,12 +177,14 @@ proc/populate_gear_list()
cost = 2 cost = 2
slot = slot_head slot = slot_head
// This was sprited and coded specifically for Zhan-Khazan characters. Before you
// decide that it's 'not even Taj themed' maybe you should read the wiki, gamer. ~ Z
/datum/gear/zhan_scarf /datum/gear/zhan_scarf
display_name = "headscarf, white" display_name = "Zhan headscarf"
path = /obj/item/clothing/head/tajaran/scarf path = /obj/item/clothing/head/tajaran/scarf
cost = 2 cost = 2
slot = slot_head slot = slot_head
// whitelisted = "Tajaran" // It's a headscarf. It isn't even a taj-themed headscarf! whitelisted = "Tajara"
// Eyes // Eyes
@@ -281,6 +284,13 @@ proc/populate_gear_list()
cost = 1 cost = 1
allowed_roles = list("Captain") allowed_roles = list("Captain")
// Wig by Earthcrusher, blame him.
/datum/gear/philosopher_wig
display_name = "natural philosopher's wig"
path = /obj/item/clothing/head/philosopher_wig
cost = 3
slot = slot_head
/datum/gear/corpsecsuit /datum/gear/corpsecsuit
display_name = "uniform, corporate (Security)" display_name = "uniform, corporate (Security)"
path = /obj/item/clothing/under/rank/security/corp path = /obj/item/clothing/under/rank/security/corp
@@ -459,7 +469,7 @@ proc/populate_gear_list()
path = /obj/item/clothing/suit/tajaran/furs path = /obj/item/clothing/suit/tajaran/furs
cost = 3 cost = 3
slot = slot_wear_suit slot = slot_wear_suit
whitelisted = "Tajaran" // You do have a monopoly on a fur suit tho whitelisted = "Tajara" // You do have a monopoly on a fur suit tho
// Gloves // Gloves

View File

@@ -62,7 +62,7 @@
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
UI_style = sanitize_inlist(UI_style, list("White", "Midnight","Orange","old"), initial(UI_style)) UI_style = sanitize_inlist(UI_style, list("White", "Midnight","Orange","old"), initial(UI_style))
be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) be_special = sanitize_integer(be_special, 0, 65535, initial(be_special))
default_slot = sanitize_integer(default_slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) default_slot = sanitize_integer(default_slot, 1, config.character_slots, initial(default_slot))
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color)) UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color))
UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha)) UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha))
@@ -94,7 +94,7 @@
if(!S) return 0 if(!S) return 0
S.cd = "/" S.cd = "/"
if(!slot) slot = default_slot if(!slot) slot = default_slot
slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot))
if(slot != default_slot) if(slot != default_slot)
default_slot = slot default_slot = slot
S["default_slot"] << slot S["default_slot"] << slot

View File

@@ -44,7 +44,7 @@
//Set species_restricted list //Set species_restricted list
switch(target_species) switch(target_species)
if("Human", "Skrell") //humanoid bodytypes if("Human", "Skrell") //humanoid bodytypes
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") species_restricted = list("exclude","Unathi","Tajara","Diona","Vox")
else else
species_restricted = list(target_species) species_restricted = list(target_species)
@@ -63,9 +63,9 @@
//Set species_restricted list //Set species_restricted list
switch(target_species) switch(target_species)
if("Skrell") if("Skrell")
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") species_restricted = list("exclude","Unathi","Tajara","Diona","Vox")
if("Human") if("Human")
species_restricted = list("exclude","Skrell","Unathi","Tajaran","Diona","Vox") species_restricted = list("exclude","Skrell","Unathi","Tajara","Diona","Vox")
else else
species_restricted = list(target_species) species_restricted = list(target_species)
@@ -177,7 +177,7 @@ BLIND // can't see anything
body_parts_covered = HANDS body_parts_covered = HANDS
slot_flags = SLOT_GLOVES slot_flags = SLOT_GLOVES
attack_verb = list("challenged") attack_verb = list("challenged")
species_restricted = list("exclude","Unathi","Tajaran") species_restricted = list("exclude","Unathi","Tajara")
sprite_sheets = list("Vox" = 'icons/mob/species/vox/gloves.dmi') sprite_sheets = list("Vox" = 'icons/mob/species/vox/gloves.dmi')
/obj/item/clothing/gloves/examine() /obj/item/clothing/gloves/examine()
@@ -214,7 +214,7 @@ BLIND // can't see anything
desc = "[desc]<br>They have had the fingertips cut off of them." desc = "[desc]<br>They have had the fingertips cut off of them."
if("exclude" in species_restricted) if("exclude" in species_restricted)
species_restricted -= "Unathi" species_restricted -= "Unathi"
species_restricted -= "Tajaran" species_restricted -= "Tajara"
return return
//Head //Head
@@ -248,7 +248,7 @@ BLIND // can't see anything
permeability_coefficient = 0.50 permeability_coefficient = 0.50
slowdown = SHOES_SLOWDOWN slowdown = SHOES_SLOWDOWN
species_restricted = list("exclude","Unathi","Tajaran") species_restricted = list("exclude","Unathi","Tajara")
sprite_sheets = list("Vox" = 'icons/mob/species/vox/shoes.dmi') sprite_sheets = list("Vox" = 'icons/mob/species/vox/shoes.dmi')
//Suit //Suit

View File

@@ -67,7 +67,7 @@
desc = "[desc]<br>They have had the fingertips cut off of them." desc = "[desc]<br>They have had the fingertips cut off of them."
if("exclude" in species_restricted) if("exclude" in species_restricted)
species_restricted -= "Unathi" species_restricted -= "Unathi"
species_restricted -= "Tajaran" species_restricted -= "Tajara"
return return
else else
user << "<span class='notice'>The [src] have already been clipped!</span>" user << "<span class='notice'>The [src] have already been clipped!</span>"

View File

@@ -253,3 +253,12 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
siemens_coefficient = 2.0 siemens_coefficient = 2.0
body_parts_covered = HEAD|FACE|EYES body_parts_covered = HEAD|FACE|EYES
/obj/item/clothing/head/philosopher_wig
name = "natural philosopher's wig"
desc = "A stylish monstrosity unearthed from Earth's Renaissance period. With this most distinguish'd wig, you'll be ready for your next soiree!"
icon_state = "philosopher_wig"
item_state = "philosopher_wig"
flags = FPRINT | TABLEPASS | BLOCKHAIR
siemens_coefficient = 2.0
body_parts_covered = 0

View File

@@ -14,15 +14,15 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
//Species-specific stuff. //Species-specific stuff.
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox") species_restricted = list("exclude","Unathi","Tajara","Skrell","Diona","Vox")
sprite_sheets_refit = list( sprite_sheets_refit = list(
"Unathi" = 'icons/mob/species/unathi/helmet.dmi', "Unathi" = 'icons/mob/species/unathi/helmet.dmi',
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', "Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
"Skrell" = 'icons/mob/species/skrell/helmet.dmi', "Skrell" = 'icons/mob/species/skrell/helmet.dmi',
) )
sprite_sheets_obj = list( sprite_sheets_obj = list(
"Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi', "Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi',
"Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi', "Tajara" = 'icons/obj/clothing/species/tajaran/hats.dmi',
"Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi', "Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi',
) )
@@ -64,15 +64,15 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox") species_restricted = list("exclude","Unathi","Tajara","Diona","Vox")
sprite_sheets_refit = list( sprite_sheets_refit = list(
"Unathi" = 'icons/mob/species/unathi/suit.dmi', "Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi', "Tajara" = 'icons/mob/species/tajaran/suit.dmi',
"Skrell" = 'icons/mob/species/skrell/suit.dmi', "Skrell" = 'icons/mob/species/skrell/suit.dmi',
) )
sprite_sheets_obj = list( sprite_sheets_obj = list(
"Unathi" = 'icons/obj/clothing/species/unathi/suits.dmi', "Unathi" = 'icons/obj/clothing/species/unathi/suits.dmi',
"Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi', "Tajara" = 'icons/obj/clothing/species/tajaran/suits.dmi',
"Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi', "Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi',
) )
@@ -364,7 +364,7 @@
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60) armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
siemens_coefficient = 0.6 siemens_coefficient = 0.6
var/obj/machinery/camera/camera var/obj/machinery/camera/camera
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox") species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox")
/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
@@ -392,7 +392,7 @@
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60) armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs)
siemens_coefficient = 0.6 siemens_coefficient = 0.6
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox") species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox")
//Wizard Rig //Wizard Rig

View File

@@ -1005,8 +1005,9 @@
desc = "A well maintained uniform from one of the many Private Security firms Nanotrasen hires from. The name Harper is printed on the back." desc = "A well maintained uniform from one of the many Private Security firms Nanotrasen hires from. The name Harper is printed on the back."
icon = 'icons/obj/custom_items.dmi' icon = 'icons/obj/custom_items.dmi'
icon_state = "harper_uniform" icon_state = "harper_uniform"
item_state = "harper_uniform" item_state = "jensensuit"
item_color = "harper_uniform" item_color = "harper_uniform"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
//////////////////// Layla's Dress - Layla Davies-Halabi - sabirm /////////////// //////////////////// Layla's Dress - Layla Davies-Halabi - sabirm ///////////////

View File

@@ -57,7 +57,7 @@
set category = "Object" set category = "Object"
set name = "Draw" set name = "Draw"
set desc = "Draw a card from a deck." set desc = "Draw a card from a deck."
set src in oview(1) set src in view(1)
if(usr.stat || !Adjacent(usr)) return if(usr.stat || !Adjacent(usr)) return
@@ -93,6 +93,7 @@
set category = "Object" set category = "Object"
set name = "Deal" set name = "Deal"
set desc = "Deal a card from a deck." set desc = "Deal a card from a deck."
set src in view(1)
if(usr.stat || !Adjacent(usr)) return if(usr.stat || !Adjacent(usr)) return
@@ -101,28 +102,35 @@
return return
var/list/players = list() var/list/players = list()
for(var/mob/living/player in orange(3)) for(var/mob/living/player in viewers(3))
if(!player.stat) if(!player.stat)
players += player players += player
players -= usr //players -= usr
var/mob/living/M = input("Who do you wish to deal a card?") as null|anything in players var/mob/living/M = input("Who do you wish to deal a card?") as null|anything in players
if(!usr || !src || !M) return if(!usr || !src || !M) return
var/obj/item/weapon/hand/H = new(get_turf(src)) deal_at(usr, M)
/obj/item/weapon/deck/proc/deal_at(mob/user, mob/target)
var/obj/item/weapon/hand/H = new(get_step(user, user.dir))
H.cards += cards[1] H.cards += cards[1]
cards -= cards[1] cards -= cards[1]
H.concealed = 1 H.concealed = 1
H.update_icon() H.update_icon()
usr.visible_message("\The [usr] deals a card to \the [M].") if(user==target)
H.throw_at(get_step(M,M.dir),10,1,H) user.visible_message("\The [user] deals a card to \himself.")
else
user.visible_message("\The [user] deals a card to \the [target].")
H.throw_at(get_step(target,target.dir),10,1,H)
/obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob) /obj/item/weapon/hand/attackby(obj/O as obj, mob/user as mob)
if(istype(O,/obj/item/weapon/hand)) if(istype(O,/obj/item/weapon/hand))
var/obj/item/weapon/hand/H = O var/obj/item/weapon/hand/H = O
for(var/datum/playingcard/P in H.cards) for(var/datum/playingcard/P in H.cards)
cards += P cards += P
src.concealed = H.concealed
del(O) del(O)
user.put_in_hands(src) user.put_in_hands(src)
update_icon() update_icon()
@@ -139,6 +147,18 @@
cards = newcards cards = newcards
user.visible_message("\The [user] shuffles [src].") user.visible_message("\The [user] shuffles [src].")
/obj/item/weapon/deck/MouseDrop(atom/over)
if(!usr || !over) return
if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows
if(!ishuman(over) || !(over in viewers(3))) return
if(!cards.len)
usr << "There are no cards in the deck."
return
deal_at(usr, over)
/obj/item/weapon/hand /obj/item/weapon/hand
name = "hand of cards" name = "hand of cards"
desc = "Some playing cards." desc = "Some playing cards."
@@ -170,6 +190,7 @@
cards -= card cards -= card
H.concealed = 0 H.concealed = 0
H.update_icon() H.update_icon()
src.update_icon()
usr.visible_message("\The [usr] plays \the [discarding].") usr.visible_message("\The [usr] plays \the [discarding].")
H.loc = get_step(usr,usr.dir) H.loc = get_step(usr,usr.dir)
@@ -188,7 +209,7 @@
for(var/datum/playingcard/P in cards) for(var/datum/playingcard/P in cards)
usr << "The [P.name]." usr << "The [P.name]."
/obj/item/weapon/hand/update_icon() /obj/item/weapon/hand/update_icon(var/direction = 0)
if(!cards.len) if(!cards.len)
del(src) del(src)
@@ -211,12 +232,43 @@
overlays += I overlays += I
return return
var/origin = -12 var/offset = Floor(20/cards.len)
var/offset = Floor(32/cards.len)
var/matrix/M = matrix()
if(direction)
switch(direction)
if(NORTH)
M.Translate( 0, 0)
if(SOUTH)
M.Translate( 0, 4)
if(WEST)
M.Turn(90)
M.Translate( 3, 0)
if(EAST)
M.Turn(90)
M.Translate(-2, 0)
var/i = 0 var/i = 0
for(var/datum/playingcard/P in cards) for(var/datum/playingcard/P in cards)
var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") ) var/image/I = new(src.icon, (concealed ? "card_back" : "[P.card_icon]") )
I.pixel_x = origin+(offset*i) //I.pixel_x = origin+(offset*i)
switch(direction)
if(SOUTH)
I.pixel_x = 8-(offset*i)
if(WEST)
I.pixel_y = -6+(offset*i)
if(EAST)
I.pixel_y = 8-(offset*i)
else
I.pixel_x = -7+(offset*i)
I.transform = M
overlays += I overlays += I
i++ i++
/obj/item/weapon/hand/dropped(mob/user as mob)
if(locate(/obj/structure/table, loc))
src.update_icon(user.dir)
else
update_icon()
/obj/item/weapon/hand/pickup(mob/user as mob)
src.update_icon()

View File

@@ -179,6 +179,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/Move(NewLoc, direct) /mob/dead/observer/Move(NewLoc, direct)
following = null
dir = direct dir = direct
if(NewLoc) if(NewLoc)
loc = NewLoc loc = NewLoc
@@ -306,6 +307,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
usr << "No area available." usr << "No area available."
usr.loc = pick(L) usr.loc = pick(L)
following = null
/mob/dead/observer/verb/follow() /mob/dead/observer/verb/follow()
set category = "Ghost" set category = "Ghost"
@@ -325,18 +327,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
following = target following = target
src << "\blue Now following [target]" src << "\blue Now following [target]"
spawn(0) spawn(0)
var/turf/pos = get_turf(src) while(target && following == target && client)
while(loc == pos && target && following == target && client)
var/turf/T = get_turf(target) var/turf/T = get_turf(target)
if(!T) if(!T)
break break
// To stop the ghost flickering. // To stop the ghost flickering.
if(loc != T) if(loc != T)
loc = T loc = T
pos = loc
sleep(15) sleep(15)
following = null
/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak /mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
set category = "Ghost" set category = "Ghost"
@@ -361,6 +359,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
A.loc = T A.loc = T
following = null
else else
A << "This mob is not located in the game world." A << "This mob is not located in the game world."
/* /*

View File

@@ -1,6 +1,8 @@
//Stand-in until this is made more lore-friendly. //Stand-in until this is made more lore-friendly.
/datum/species/xenos /datum/species/xenos
name = "Xenomorph" name = "Xenomorph"
name_plural = "Xenomorphs"
default_language = "Xenomorph" default_language = "Xenomorph"
language = "Hivemind" language = "Hivemind"
unarmed_type = /datum/unarmed_attack/claws/strong unarmed_type = /datum/unarmed_attack/claws/strong
@@ -40,7 +42,6 @@
has_organ = list( has_organ = list(
"heart" = /datum/organ/internal/heart, "heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno, "brain" = /datum/organ/internal/brain/xeno,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel,
"hive node" = /datum/organ/internal/xenos/hivenode, "hive node" = /datum/organ/internal/xenos/hivenode,
@@ -116,7 +117,6 @@
has_organ = list( has_organ = list(
"heart" = /datum/organ/internal/heart, "heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno, "brain" = /datum/organ/internal/brain/xeno,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen,
"acid gland" = /datum/organ/internal/xenos/acidgland, "acid gland" = /datum/organ/internal/xenos/acidgland,
@@ -155,7 +155,6 @@
has_organ = list( has_organ = list(
"heart" = /datum/organ/internal/heart, "heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno, "brain" = /datum/organ/internal/brain/xeno,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/hunter, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/hunter,
"hive node" = /datum/organ/internal/xenos/hivenode, "hive node" = /datum/organ/internal/xenos/hivenode,
@@ -183,7 +182,6 @@
has_organ = list( has_organ = list(
"heart" = /datum/organ/internal/heart, "heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno, "brain" = /datum/organ/internal/brain/xeno,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/sentinel, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/sentinel,
"acid gland" = /datum/organ/internal/xenos/acidgland, "acid gland" = /datum/organ/internal/xenos/acidgland,
@@ -214,7 +212,6 @@
has_organ = list( has_organ = list(
"heart" = /datum/organ/internal/heart, "heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno, "brain" = /datum/organ/internal/brain/xeno,
"egg sac" = /datum/organ/internal/xenos/eggsac, "egg sac" = /datum/organ/internal/xenos/eggsac,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen,

View File

@@ -1210,7 +1210,7 @@
src << msg src << msg
organ.take_damage(rand(1,3), 0, 0) organ.take_damage(rand(1,3), 0, 0)
if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses. if(!(organ.status & ORGAN_ROBOT) && !(species.flags & NO_BLOOD)) //There is no blood in protheses.
organ.status |= ORGAN_BLEEDING organ.status |= ORGAN_BLEEDING
src.adjustToxLoss(rand(1,3)) src.adjustToxLoss(rand(1,3))

View File

@@ -102,7 +102,6 @@
if(!G) //the grab will delete itself in New if affecting is anchored if(!G) //the grab will delete itself in New if affecting is anchored
return return
M.put_in_active_hand(G) M.put_in_active_hand(G)
grabbed_by += G
G.synch() G.synch()
LAssailant = M LAssailant = M

View File

@@ -12,7 +12,7 @@
/mob/living/carbon/human/tajaran/New(var/new_loc) /mob/living/carbon/human/tajaran/New(var/new_loc)
h_style = "Tajaran Ears" h_style = "Tajaran Ears"
..(new_loc, "Tajaran") ..(new_loc, "Tajara")
/mob/living/carbon/human/unathi/New(var/new_loc) /mob/living/carbon/human/unathi/New(var/new_loc)
h_style = "Unathi Horns" h_style = "Unathi Horns"

View File

@@ -687,6 +687,7 @@ It can still be worn/put on as normal.
for (var/obj/item/weapon/grab/G in target.grabbed_by) for (var/obj/item/weapon/grab/G in target.grabbed_by)
if (G.loc == source && G.state >= GRAB_AGGRESSIVE) if (G.loc == source && G.state >= GRAB_AGGRESSIVE)
grabbing = 1 grabbing = 1
break
if (!grabbing) if (!grabbing)
slot_to_process = null slot_to_process = null
source << "\red Your grasp was broken before you could restrain [target]!" source << "\red Your grasp was broken before you could restrain [target]!"

View File

@@ -5,6 +5,7 @@
/datum/species /datum/species
var/name // Species name. var/name // Species name.
var/name_plural
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set. var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set. var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
@@ -202,6 +203,7 @@
/datum/species/human /datum/species/human
name = "Human" name = "Human"
name_plural = "Humans"
language = "Sol Common" language = "Sol Common"
primitive = /mob/living/carbon/monkey primitive = /mob/living/carbon/monkey
unarmed_type = /datum/unarmed_attack/punch unarmed_type = /datum/unarmed_attack/punch
@@ -213,6 +215,7 @@
/datum/species/unathi /datum/species/unathi
name = "Unathi" name = "Unathi"
name_plural = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi' icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi' deform = 'icons/mob/human_races/r_def_lizard.dmi'
language = "Sinta'unathi" language = "Sinta'unathi"
@@ -239,7 +242,8 @@
base_color = "#066000" base_color = "#066000"
/datum/species/tajaran /datum/species/tajaran
name = "Tajaran" name = "Tajara"
name_plural = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi' icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi' deform = 'icons/mob/human_races/r_def_tajaran.dmi'
language = "Siik'tajr" language = "Siik'tajr"
@@ -264,6 +268,7 @@
/datum/species/skrell /datum/species/skrell
name = "Skrell" name = "Skrell"
name_plural = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi' icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi' deform = 'icons/mob/human_races/r_def_skrell.dmi'
language = "Skrellian" language = "Skrellian"
@@ -278,6 +283,7 @@
/datum/species/vox /datum/species/vox
name = "Vox" name = "Vox"
name_plural = "Vox"
icobase = 'icons/mob/human_races/r_vox.dmi' icobase = 'icons/mob/human_races/r_vox.dmi'
deform = 'icons/mob/human_races/r_def_vox.dmi' deform = 'icons/mob/human_races/r_def_vox.dmi'
default_language = "Vox-pidgin" default_language = "Vox-pidgin"
@@ -324,6 +330,7 @@
/datum/species/vox/armalis /datum/species/vox/armalis
name = "Vox Armalis" name = "Vox Armalis"
name_plural = "Vox"
icobase = 'icons/mob/human_races/r_armalis.dmi' icobase = 'icons/mob/human_races/r_armalis.dmi'
deform = 'icons/mob/human_races/r_armalis.dmi' deform = 'icons/mob/human_races/r_armalis.dmi'
rarity_value = 10 rarity_value = 10
@@ -364,6 +371,7 @@
/datum/species/diona /datum/species/diona
name = "Diona" name = "Diona"
name_plural = "Dionaea"
icobase = 'icons/mob/human_races/r_diona.dmi' icobase = 'icons/mob/human_races/r_diona.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi' deform = 'icons/mob/human_races/r_def_plant.dmi'
language = "Rootspeak" language = "Rootspeak"
@@ -428,6 +436,8 @@
/datum/species/machine /datum/species/machine
name = "Machine" name = "Machine"
name_plural = "machines"
icobase = 'icons/mob/human_races/r_machine.dmi' icobase = 'icons/mob/human_races/r_machine.dmi'
deform = 'icons/mob/human_races/r_machine.dmi' deform = 'icons/mob/human_races/r_machine.dmi'
language = "Tradeband" language = "Tradeband"
@@ -467,9 +477,11 @@
if(H.a_intent != "hurt") if(H.a_intent != "hurt")
return 0 return 0
if(unarmed.shredding && unarmed.is_usable(H)) if(unarmed.is_usable(H))
if(unarmed.shredding)
return 1 return 1
else if(secondary_unarmed.shredding && secondary_unarmed.is_usable(H)) else if(secondary_unarmed.is_usable(H))
if(secondary_unarmed.shredding)
return 1 return 1
return 0 return 0
@@ -502,7 +514,7 @@
/datum/unarmed_attack/bite /datum/unarmed_attack/bite
attack_verb = list("bite") // 'x has biteed y', needs work. attack_verb = list("bite") // 'x has biteed y', needs work.
attack_sound = 'sound/weapons/bite.ogg' attack_sound = 'sound/weapons/bite.ogg'
shredding = 1 shredding = 0
damage = 5 damage = 5
sharp = 1 sharp = 1
edge = 1 edge = 1
@@ -551,6 +563,7 @@
var/has_throw = 1 // Set to draw throw button. var/has_throw = 1 // Set to draw throw button.
var/has_resist = 1 // Set to draw resist button. var/has_resist = 1 // Set to draw resist button.
var/has_internals = 1 // Set to draw the internals toggle button. var/has_internals = 1 // Set to draw the internals toggle button.
var/list/equip_slots = list() // Checked by mob_can_equip().
// Contains information on the position and tag for all inventory slots // Contains information on the position and tag for all inventory slots
// to be drawn for the mob. This is fairly delicate, try to avoid messing with it // to be drawn for the mob. This is fairly delicate, try to avoid messing with it
@@ -572,3 +585,18 @@
"storage2" = list("loc" = ui_storage2, "slot" = slot_r_store, "state" = "pocket"), "storage2" = list("loc" = ui_storage2, "slot" = slot_r_store, "state" = "pocket"),
"belt" = list("loc" = ui_belt, "slot" = slot_belt, "state" = "belt") "belt" = list("loc" = ui_belt, "slot" = slot_belt, "state" = "belt")
) )
/datum/hud_data/New()
..()
for(var/slot in gear)
equip_slots |= gear[slot]["slot"]
if(has_hands)
equip_slots |= slot_l_hand
equip_slots |= slot_r_hand
equip_slots |= slot_handcuffed
if(slot_back in equip_slots)
equip_slots |= slot_in_backpack
equip_slots |= slot_legcuffed

View File

@@ -177,6 +177,7 @@ var/global/list/damage_icon_parts = list()
proc/get_damage_icon_part(damage_state, body_part) proc/get_damage_icon_part(damage_state, body_part)
if(damage_icon_parts["[damage_state]/[body_part]"] == null) if(damage_icon_parts["[damage_state]/[body_part]"] == null)
var/icon/DI = new /icon('icons/mob/dam_human.dmi', damage_state) // the damage icon for whole human var/icon/DI = new /icon('icons/mob/dam_human.dmi', damage_state) // the damage icon for whole human
// TODO: Convert dam_human.dmi to greyscale and blend in species.blood_colour here.
DI.Blend(new /icon('icons/mob/dam_mask.dmi', body_part), ICON_MULTIPLY) // mask with this organ's pixels DI.Blend(new /icon('icons/mob/dam_mask.dmi', body_part), ICON_MULTIPLY) // mask with this organ's pixels
damage_icon_parts["[damage_state]/[body_part]"] = DI damage_icon_parts["[damage_state]/[body_part]"] = DI
return DI return DI

View File

@@ -94,7 +94,7 @@
..() ..()
dna.mutantrace = "tajaran" dna.mutantrace = "tajaran"
greaterform = "Tajaran" greaterform = "Tajara"
add_language("Siik'tajr") add_language("Siik'tajr")
/mob/living/carbon/monkey/movement_delay() /mob/living/carbon/monkey/movement_delay()
@@ -231,7 +231,6 @@
M.put_in_active_hand(G) M.put_in_active_hand(G)
grabbed_by += G
G.synch() G.synch()
LAssailant = M LAssailant = M
@@ -256,6 +255,7 @@
return return
/mob/living/carbon/monkey/attack_animal(mob/living/M as mob) /mob/living/carbon/monkey/attack_animal(mob/living/M as mob)
if(M.melee_damage_upper == 0) if(M.melee_damage_upper == 0)
M.emote("[M.friendly] [src]") M.emote("[M.friendly] [src]")
else else

View File

@@ -245,7 +245,7 @@ var/list/ai_verbs_default = list(
//if(icon_state == initial(icon_state)) //if(icon_state == initial(icon_state))
var/icontype = "" var/icontype = ""
if (custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available if (custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available
else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Rainbow", "Blue", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Soviet", "Trapped", "Heartline") else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Rainbow", "Blue", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Soviet", "Trapped", "Heartline", "Chatterbox")
switch(icontype) switch(icontype)
if("Custom") icon_state = "[src.ckey]-ai" if("Custom") icon_state = "[src.ckey]-ai"
if("Rainbow") icon_state = "ai-clown" if("Rainbow") icon_state = "ai-clown"
@@ -266,6 +266,7 @@ var/list/ai_verbs_default = list(
if("Soviet") icon_state = "ai-redoctober" if("Soviet") icon_state = "ai-redoctober"
if("Trapped") icon_state = "ai-hades" if("Trapped") icon_state = "ai-hades"
if("Heartline") icon_state = "ai-heartline" if("Heartline") icon_state = "ai-heartline"
if("Chatterbox") icon_state = "ai-president"
else icon_state = "ai" else icon_state = "ai"
//else //else
//usr <<"You can only change your display once!" //usr <<"You can only change your display once!"

View File

@@ -88,7 +88,7 @@
//Pass the attack on to the target. This might delete/relocate wrapped. //Pass the attack on to the target. This might delete/relocate wrapped.
target.attackby(wrapped,user) target.attackby(wrapped,user)
//If wrapped did neither get deleted nor put into target, put it back into the gripper. //If wrapped was neither deleted nor put into target, put it back into the gripper.
if(wrapped && user && (wrapped.loc == user)) if(wrapped && user && (wrapped.loc == user))
wrapped.loc = src wrapped.loc = src
else else

View File

@@ -861,6 +861,8 @@ var/list/robot_verbs_default = list(
spark_system.start() spark_system.start()
return ..() return ..()
/mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M as mob) /mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M as mob)
if (!ticker) if (!ticker)
M << "You cannot attack people before the game has started." M << "You cannot attack people before the game has started."

View File

@@ -181,6 +181,9 @@
H.internal_organs_by_name["brain"] = B H.internal_organs_by_name["brain"] = B
H.internal_organs |= B H.internal_organs |= B
var/datum/organ/external/affecting = H.get_organ("head")
affecting.implants -= src
var/s2h_id = src.computer_id var/s2h_id = src.computer_id
var/s2h_ip= src.lastKnownIP var/s2h_ip= src.lastKnownIP
src.computer_id = null src.computer_id = null

View File

@@ -250,7 +250,6 @@
M.put_in_active_hand(G) M.put_in_active_hand(G)
grabbed_by += G
G.synch() G.synch()
G.affecting = src G.affecting = src
LAssailant = M LAssailant = M
@@ -267,6 +266,7 @@
return return
/mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob) /mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob)
if (!ticker) if (!ticker)
M << "You cannot attack people before the game has started." M << "You cannot attack people before the game has started."

View File

@@ -28,6 +28,8 @@
del(src) del(src)
return return
affecting.grabbed_by += src
hud = new /obj/screen/grab(src) hud = new /obj/screen/grab(src)
hud.icon_state = "reinforce" hud.icon_state = "reinforce"
hud.name = "reinforce grab" hud.name = "reinforce grab"

View File

@@ -496,7 +496,7 @@
name = "Shaved" name = "Shaved"
icon_state = "bald" icon_state = "bald"
gender = NEUTER gender = NEUTER
species_allowed = list("Human","Unathi","Tajaran","Skrell","Vox","Machine") species_allowed = list("Human","Unathi","Tajara","Skrell","Vox","Machine")
watson watson
name = "Watson Mustache" name = "Watson Mustache"
@@ -636,62 +636,62 @@
taj_ears taj_ears
name = "Tajaran Ears" name = "Tajaran Ears"
icon_state = "ears_plain" icon_state = "ears_plain"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_clean taj_ears_clean
name = "Tajara Clean" name = "Tajara Clean"
icon_state = "hair_clean" icon_state = "hair_clean"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_bangs taj_ears_bangs
name = "Tajara Bangs" name = "Tajara Bangs"
icon_state = "hair_bangs" icon_state = "hair_bangs"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_braid taj_ears_braid
name = "Tajara Braid" name = "Tajara Braid"
icon_state = "hair_tbraid" icon_state = "hair_tbraid"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_shaggy taj_ears_shaggy
name = "Tajara Shaggy" name = "Tajara Shaggy"
icon_state = "hair_shaggy" icon_state = "hair_shaggy"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_mohawk taj_ears_mohawk
name = "Tajaran Mohawk" name = "Tajaran Mohawk"
icon_state = "hair_mohawk" icon_state = "hair_mohawk"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_plait taj_ears_plait
name = "Tajara Plait" name = "Tajara Plait"
icon_state = "hair_plait" icon_state = "hair_plait"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_straight taj_ears_straight
name = "Tajara Straight" name = "Tajara Straight"
icon_state = "hair_straight" icon_state = "hair_straight"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_long taj_ears_long
name = "Tajara Long" name = "Tajara Long"
icon_state = "hair_long" icon_state = "hair_long"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_rattail taj_ears_rattail
name = "Tajara Rat Tail" name = "Tajara Rat Tail"
icon_state = "hair_rattail" icon_state = "hair_rattail"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_spiky taj_ears_spiky
name = "Tajara Spiky" name = "Tajara Spiky"
icon_state = "hair_tajspiky" icon_state = "hair_tajspiky"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_ears_messy taj_ears_messy
name = "Tajara Messy" name = "Tajara Messy"
icon_state = "hair_messy" icon_state = "hair_messy"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
vox_quills_short vox_quills_short
name = "Short Vox Quills" name = "Short Vox Quills"
@@ -703,32 +703,32 @@
taj_sideburns taj_sideburns
name = "Tajara Sideburns" name = "Tajara Sideburns"
icon_state = "facial_mutton" icon_state = "facial_mutton"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_mutton taj_mutton
name = "Tajara Mutton" name = "Tajara Mutton"
icon_state = "facial_mutton" icon_state = "facial_mutton"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_pencilstache taj_pencilstache
name = "Tajara Pencilstache" name = "Tajara Pencilstache"
icon_state = "facial_pencilstache" icon_state = "facial_pencilstache"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_moustache taj_moustache
name = "Tajara Moustache" name = "Tajara Moustache"
icon_state = "facial_moustache" icon_state = "facial_moustache"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_goatee taj_goatee
name = "Tajara Goatee" name = "Tajara Goatee"
icon_state = "facial_goatee" icon_state = "facial_goatee"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
taj_smallstache taj_smallstache
name = "Tajara Smallsatche" name = "Tajara Smallsatche"
icon_state = "facial_smallstache" icon_state = "facial_smallstache"
species_allowed = list("Tajaran") species_allowed = list("Tajara")
//skin styles - WIP //skin styles - WIP
//going to have to re-integrate this with surgery //going to have to re-integrate this with surgery
@@ -750,7 +750,7 @@
name = "Default tajaran skin" name = "Default tajaran skin"
icon_state = "default" icon_state = "default"
icon = 'icons/mob/human_races/r_tajaran.dmi' icon = 'icons/mob/human_races/r_tajaran.dmi'
species_allowed = list("Tajaran") species_allowed = list("Tajara")
unathi unathi
name = "Default Unathi skin" name = "Default Unathi skin"

View File

@@ -8,10 +8,14 @@ mob/var/last_typed_time
var/global/image/typing_indicator var/global/image/typing_indicator
/mob/proc/set_typing_indicator(var/state) /mob/proc/set_typing_indicator(var/state)
if(client)
if(!(client.prefs.toggles & SHOW_TYPING))
if(!typing_indicator) if(!typing_indicator)
typing_indicator = image('icons/mob/talk.dmi',null,"typing") typing_indicator = image('icons/mob/talk.dmi',null,"typing")
if(client)
if(client.prefs.toggles & SHOW_TYPING)
overlays -= typing_indicator
else
if(state) if(state)
if(!typing) if(!typing)
overlays += typing_indicator overlays += typing_indicator
@@ -72,5 +76,10 @@ var/global/image/typing_indicator
set desc = "Toggles showing an indicator when you are typing emote or say message." set desc = "Toggles showing an indicator when you are typing emote or say message."
prefs.toggles ^= SHOW_TYPING prefs.toggles ^= SHOW_TYPING
prefs.save_preferences() prefs.save_preferences()
src << "You will [(prefs.toggles & CHAT_OOC) ? "no longer" : "now"] display typing indicator." src << "You will [(prefs.toggles & SHOW_TYPING) ? "no longer" : "now"] display a typing indicator."
// Clear out any existing typing indicator.
if(prefs.toggles & SHOW_TYPING)
if(istype(mob)) mob.set_typing_indicator(0)
feedback_add_details("admin_verb","TID") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! feedback_add_details("admin_verb","TID") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!

View File

@@ -27,7 +27,8 @@
filenames = flist(path) filenames = flist(path)
for(var/filename in filenames) for(var/filename in filenames)
if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore if(copytext(filename, length(filename)) != "/") // filenames which end in "/" are actually directories, which we want to ignore
asset_files.Add(file(path + filename)) // add this file to asset_files for sending to clients when they connect if(fexists(path + filename))
asset_files.Add(fcopy_rsc(path + filename)) // add this file to asset_files for sending to clients when they connect
return return

View File

@@ -32,7 +32,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if(B.id == "blood") if(B.id == "blood")
B.data = list( "donor"=src,"viruses"=null,"species"=species.name,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.blood_color,"blood_type"=dna.b_type, \ B.data = list( "donor"=src,"viruses"=null,"species"=species.name,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.blood_color,"blood_type"=dna.b_type, \
"resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = null) "resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = null)
B.color = B.data["blood_color"] B.color = B.data["blood_colour"]
// Takes care blood loss and regeneration // Takes care blood loss and regeneration
/mob/living/carbon/human/proc/handle_blood() /mob/living/carbon/human/proc/handle_blood()

View File

@@ -96,8 +96,8 @@
if(!istype(H)) if(!istype(H))
return return
var/datum/reagent/blood = H.vessel.reagent_list["blood"] var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
blood_splatter(H,blood,1) blood_splatter(H,B,1)
var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
if(goo) if(goo)
goo.name = "husk ichor" goo.name = "husk ichor"
@@ -170,27 +170,31 @@
name = "xeno organ" name = "xeno organ"
icon = 'icons/effects/blood.dmi' icon = 'icons/effects/blood.dmi'
desc = "It smells like an accident in a chemical factory." desc = "It smells like an accident in a chemical factory."
organ_tag = "special" //TODO functionality for transplants.
/obj/item/organ/xenos/eggsac /obj/item/organ/xenos/eggsac
name = "egg sac" name = "egg sac"
icon_state = "xgibmid1" icon_state = "xgibmid1"
organ_tag = "egg sac"
/obj/item/organ/xenos/plasmavessel /obj/item/organ/xenos/plasmavessel
name = "plasma vessel" name = "plasma vessel"
icon_state = "xgibdown" icon_state = "xgibdown1"
organ_tag = "plasma vessel"
/obj/item/organ/xenos/acidgland /obj/item/organ/xenos/acidgland
name = "acid gland" name = "acid gland"
icon_state = "xgibtorso" icon_state = "xgibtorso"
organ_tag = "acid gland"
/obj/item/organ/xenos/hivenode /obj/item/organ/xenos/hivenode
name = "hive node" name = "hive node"
icon_state = "xgibmid2" icon_state = "xgibmid2"
organ_tag = "hive node"
/obj/item/organ/xenos/resinspinner /obj/item/organ/xenos/resinspinner
name = "hive node" name = "hive node"
icon_state = "xgibmid2" icon_state = "xgibmid2"
organ_tag = "resin spinner"
//VOX ORGANS. //VOX ORGANS.
/datum/organ/internal/stack /datum/organ/internal/stack

View File

@@ -490,13 +490,18 @@ Note that amputating the affected organ does in fact remove the infection from t
burn_dam = 0 burn_dam = 0
status &= ~ORGAN_BLEEDING status &= ~ORGAN_BLEEDING
var/clamped = 0 var/clamped = 0
var/mob/living/carbon/human/H
if(istype(owner,/mob/living/carbon/human))
H = owner
for(var/datum/wound/W in wounds) for(var/datum/wound/W in wounds)
if(W.damage_type == CUT || W.damage_type == BRUISE) if(W.damage_type == CUT || W.damage_type == BRUISE)
brute_dam += W.damage brute_dam += W.damage
else if(W.damage_type == BURN) else if(W.damage_type == BURN)
burn_dam += W.damage burn_dam += W.damage
if(!(status & ORGAN_ROBOT) && W.bleeding()) if(!(status & ORGAN_ROBOT) && W.bleeding() && (H && !(H.species.flags & NO_BLOOD)))
W.bleed_timer-- W.bleed_timer--
status |= ORGAN_BLEEDING status |= ORGAN_BLEEDING
@@ -504,7 +509,7 @@ Note that amputating the affected organ does in fact remove the infection from t
number_wounds += W.amount number_wounds += W.amount
if (open && !clamped) //things tend to bleed if they are CUT OPEN if (open && !clamped && (H && !(H.species.flags & NO_BLOOD))) //things tend to bleed if they are CUT OPEN
status |= ORGAN_BLEEDING status |= ORGAN_BLEEDING

View File

@@ -83,14 +83,15 @@
if(rejecting % 10 == 0) //Only fire every ten rejection ticks. if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
switch(rejecting) switch(rejecting)
if(1 to 50) if(1 to 50)
take_damage(rand(1,2)) take_damage(1)
if(51 to 200) if(51 to 200)
take_damage(rand(2,3))
if(201 to 500)
take_damage(rand(3,4))
owner.reagents.add_reagent("toxin", 1) owner.reagents.add_reagent("toxin", 1)
take_damage(1)
if(201 to 500)
take_damage(rand(2,3))
owner.reagents.add_reagent("toxin", 2)
if(501 to INFINITY) if(501 to INFINITY)
take_damage(5) take_damage(4)
owner.reagents.add_reagent("toxin", rand(3,5)) owner.reagents.add_reagent("toxin", rand(3,5))
/datum/organ/internal/proc/take_damage(amount, var/silent=0) /datum/organ/internal/proc/take_damage(amount, var/silent=0)

View File

@@ -46,8 +46,8 @@
if(fresh && prob(40)) if(fresh && prob(40))
fresh-- fresh--
var/datum/reagent/blood = reagents.reagent_list["blood"] var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
blood_splatter(src,blood,1) blood_splatter(src,B,1)
health -= rand(1,3) health -= rand(1,3)
if(health <= 0) if(health <= 0)
@@ -215,8 +215,8 @@
return return
user << "\blue You take an experimental bite out of \the [src]." user << "\blue You take an experimental bite out of \the [src]."
var/datum/reagent/blood = reagents.reagent_list["blood"] var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
blood_splatter(src,blood,1) blood_splatter(src,B,1)
user.drop_from_inventory(src) user.drop_from_inventory(src)

View File

@@ -66,13 +66,13 @@
// TG uses a special garbage collector.. qdel(P) // TG uses a special garbage collector.. qdel(P)
del(P) //so 10 thousand pictures items are not left in memory should an AI take them and then view them all. del(P) //so 10 thousand pictures items are not left in memory should an AI take them and then view them all.
/obj/item/device/camera/siliconcam/proc/deletepicture(obj/item/device/camera/siliconcam/cam) /obj/item/device/camera/siliconcam/proc/deletepicture()
var/datum/picture/selection = selectpicture(cam) var/datum/picture/selection = selectpicture()
if(!selection) if(!selection)
return return
cam.aipictures -= selection aipictures -= selection
usr << "<span class='unconscious'>Image deleted</span>" usr << "<span class='unconscious'>Image deleted</span>"
/obj/item/device/camera/siliconcam/ai_camera/can_capture_turf(turf/T, mob/user) /obj/item/device/camera/siliconcam/ai_camera/can_capture_turf(turf/T, mob/user)
@@ -147,7 +147,12 @@
set src in usr set src in usr
// Explicitly only allow deletion from the local camera // Explicitly only allow deletion from the local camera
deletepicture(src) var/mob/living/silicon/robot/C = src.loc
if(C.connected_ai)
C << "Not allowed to delete from the remote database."
return
deletepicture()
obj/item/device/camera/siliconcam/proc/getsource() obj/item/device/camera/siliconcam/proc/getsource()
if(istype(src.loc, /mob/living/silicon/ai)) if(istype(src.loc, /mob/living/silicon/ai))

View File

@@ -21,7 +21,7 @@
icon_state = "bbox_on" icon_state = "bbox_on"
// Enabled on server startup. Used in substations to keep them in bypass mode. // Enabled on server startup. Used in substations to keep them in bypass mode.
/obj/machinery/power/breakerbox/activated/New() /obj/machinery/power/breakerbox/activated/initialize()
set_state(1) set_state(1)
/obj/machinery/power/breakerbox/examine() /obj/machinery/power/breakerbox/examine()

View File

@@ -67,6 +67,7 @@ var/global/list/rad_collectors = list()
src.P = W src.P = W
W.loc = src W.loc = src
update_icons() update_icons()
return 1
else if(istype(W, /obj/item/weapon/crowbar)) else if(istype(W, /obj/item/weapon/crowbar))
if(P && !src.locked) if(P && !src.locked)
eject() eject()
@@ -84,6 +85,7 @@ var/global/list/rad_collectors = list()
connect_to_network() connect_to_network()
else else
disconnect_from_network() disconnect_from_network()
return 1
else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if (src.allowed(user)) if (src.allowed(user))
if(active) if(active)
@@ -95,9 +97,7 @@ var/global/list/rad_collectors = list()
else else
user << "\red Access denied!" user << "\red Access denied!"
return 1 return 1
else return ..()
..()
return 1
/obj/machinery/power/rad_collector/examine() /obj/machinery/power/rad_collector/examine()
..() ..()

View File

@@ -146,3 +146,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
new stacktype(src.loc, amount) new stacktype(src.loc, amount)
busy = 0 busy = 0
src.updateUsrDialog() src.updateUsrDialog()
//This is to stop these machines being hackable via clicking.
/obj/machinery/r_n_d/circuit_imprinter/attack_hand(mob/user as mob)
return

View File

@@ -172,3 +172,7 @@ Note: Must be placed west/left of and R&D console to function.
busy = 0 busy = 0
src.updateUsrDialog() src.updateUsrDialog()
return return
//This is to stop these machines being hackable via clicking.
/obj/machinery/r_n_d/protolathe/attack_hand(mob/user as mob)
return

View File

@@ -5,6 +5,8 @@
//3 = code delta //3 = code delta
//config.alert_desc_blue_downto //config.alert_desc_blue_downto
/var/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg'))
/var/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1)
/proc/set_security_level(var/level) /proc/set_security_level(var/level)
switch(level) switch(level)
@@ -21,7 +23,7 @@
if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level) if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level)
switch(level) switch(level)
if(SEC_LEVEL_GREEN) if(SEC_LEVEL_GREEN)
security_announcement.Announce("[config.alert_desc_green]", "Attention! Security level lowered to green") security_announcement_down.Announce("[config.alert_desc_green]", "Attention! Security level lowered to green")
security_level = SEC_LEVEL_GREEN security_level = SEC_LEVEL_GREEN
for(var/obj/machinery/firealarm/FA in machines) for(var/obj/machinery/firealarm/FA in machines)
if(FA.z == 1 || FA.z == 5) if(FA.z == 1 || FA.z == 5)
@@ -29,9 +31,9 @@
FA.overlays += image('icons/obj/monitors.dmi', "overlay_green") FA.overlays += image('icons/obj/monitors.dmi', "overlay_green")
if(SEC_LEVEL_BLUE) if(SEC_LEVEL_BLUE)
if(security_level < SEC_LEVEL_BLUE) if(security_level < SEC_LEVEL_BLUE)
security_announcement.Announce("[config.alert_desc_blue_upto]", "Attention! Security level elevated to blue") security_announcement_up.Announce("[config.alert_desc_blue_upto]", "Attention! Security level elevated to blue")
else else
security_announcement.Announce("[config.alert_desc_blue_downto]", "Attention! Security level lowered to blue") security_announcement_down.Announce("[config.alert_desc_blue_downto]", "Attention! Security level lowered to blue")
security_level = SEC_LEVEL_BLUE security_level = SEC_LEVEL_BLUE
for(var/obj/machinery/firealarm/FA in machines) for(var/obj/machinery/firealarm/FA in machines)
if(FA.z == 1 || FA.z == 5) if(FA.z == 1 || FA.z == 5)
@@ -39,9 +41,9 @@
FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue") FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue")
if(SEC_LEVEL_RED) if(SEC_LEVEL_RED)
if(security_level < SEC_LEVEL_RED) if(security_level < SEC_LEVEL_RED)
security_announcement.Announce("[config.alert_desc_red_upto]", "Attention! Code red!") security_announcement_up.Announce("[config.alert_desc_red_upto]", "Attention! Code red!")
else else
security_announcement.Announce("[config.alert_desc_red_downto]", "Attention! Code red!") security_announcement_down.Announce("[config.alert_desc_red_downto]", "Attention! Code red!")
security_level = SEC_LEVEL_RED security_level = SEC_LEVEL_RED
/* - At the time of commit, setting status displays didn't work properly /* - At the time of commit, setting status displays didn't work properly
@@ -55,7 +57,7 @@
FA.overlays += image('icons/obj/monitors.dmi', "overlay_red") FA.overlays += image('icons/obj/monitors.dmi', "overlay_red")
if(SEC_LEVEL_DELTA) if(SEC_LEVEL_DELTA)
security_announcement.Announce("[config.alert_desc_delta]", "Attention! Delta security level reached!") security_announcement_up.Announce("[config.alert_desc_delta]", "Attention! Delta security level reached!")
security_level = SEC_LEVEL_DELTA security_level = SEC_LEVEL_DELTA
for(var/obj/machinery/firealarm/FA in machines) for(var/obj/machinery/firealarm/FA in machines)
if(FA.z == 1 || FA.z == 5) if(FA.z == 1 || FA.z == 5)

View File

@@ -52,7 +52,10 @@
"\blue You have made a bloodless incision on [target]'s [affected.display_name] with \the [tool].",) "\blue You have made a bloodless incision on [target]'s [affected.display_name] with \the [tool].",)
//Could be cleaner ... //Could be cleaner ...
affected.open = 1 affected.open = 1
if(istype(target) && !(target.species.flags & NO_BLOOD))
affected.status |= ORGAN_BLEEDING affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1) affected.createwound(CUT, 1)
affected.clamp() affected.clamp()
spread_germs_to_organ(affected, user) spread_germs_to_organ(affected, user)
@@ -89,7 +92,10 @@
user.visible_message("\blue [user] has constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].", \ user.visible_message("\blue [user] has constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].", \
"\blue You have constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].",) "\blue You have constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].",)
affected.open = 1 affected.open = 1
if(istype(target) && !(target.species.flags & NO_BLOOD))
affected.status |= ORGAN_BLEEDING affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1) affected.createwound(CUT, 1)
affected.clamp() affected.clamp()
affected.open = 2 affected.open = 2
@@ -128,7 +134,10 @@
user.visible_message("\blue [user] has made an incision on [target]'s [affected.display_name] with \the [tool].", \ user.visible_message("\blue [user] has made an incision on [target]'s [affected.display_name] with \the [tool].", \
"\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",) "\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",)
affected.open = 1 affected.open = 1
if(istype(target) && !(target.species.flags & NO_BLOOD))
affected.status |= ORGAN_BLEEDING affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1) affected.createwound(CUT, 1)
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)

View File

@@ -327,7 +327,7 @@
O.organ_data.rejecting = null O.organ_data.rejecting = null
// Transfer over some blood data, if the organ doesn't have data. // Transfer over some blood data, if the organ doesn't have data.
var/datum/reagent/blood/organ_blood = O.reagents.reagent_list["blood"] var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in O.reagents.reagent_list
if(!organ_blood || !organ_blood.data["blood_DNA"]) if(!organ_blood || !organ_blood.data["blood_DNA"])
target.vessel.trans_to(O, 5, 1, 1) target.vessel.trans_to(O, 5, 1, 1)
@@ -367,32 +367,32 @@
if(!target.species) if(!target.species)
user << "\red You have no idea what species this person is. Report this on the bug tracker." user << "\red You have no idea what species this person is. Report this on the bug tracker."
return 0 return 2
var/o_is = (O.gender == PLURAL) ? "are" : "is" var/o_is = (O.gender == PLURAL) ? "are" : "is"
var/o_a = (O.gender == PLURAL) ? "" : " a" var/o_a = (O.gender == PLURAL) ? "" : "a "
var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't" var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't"
if(target.species.has_organ[O.organ_tag]) if(target.species.has_organ[O.organ_tag])
if(!O.health) if(!O.health)
user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted."
return 0 return 2
if(!target.internal_organs_by_name[O.organ_tag]) if(!target.internal_organs_by_name[O.organ_tag])
organ_missing = 1 organ_missing = 1
else else
user << "\red \The [target] already has [o_a][O.organ_tag]." user << "\red \The [target] already has [o_a][O.organ_tag]."
return 0 return 2
if(O.organ_data && affected.name == O.organ_data.parent_organ) if(O.organ_data && affected.name == O.organ_data.parent_organ)
organ_compatible = 1 organ_compatible = 1
else else
user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.display_name]." user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.display_name]."
return 0 return 2
else else
user << "\red \A [target.species.name] doesn't normally have [o_a][O.organ_tag]." user << "\red You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag]."
return 0 return 2
return ..() && organ_missing && organ_compatible return ..() && organ_missing && organ_compatible
@@ -412,7 +412,7 @@
if(istype(O)) if(istype(O))
var/datum/reagent/blood/transplant_blood = O.reagents.reagent_list["blood"] var/datum/reagent/blood/transplant_blood = locate(/datum/reagent/blood) in O.reagents.reagent_list
if(!transplant_blood) if(!transplant_blood)
O.organ_data.transplant_data = list() O.organ_data.transplant_data = list()
O.organ_data.transplant_data["species"] = target.species.name O.organ_data.transplant_data["species"] = target.species.name

View File

@@ -77,21 +77,34 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
E.germ_level = max(germ_level,E.germ_level) //as funny as scrubbing microbes out with clean gloves is - no. E.germ_level = max(germ_level,E.germ_level) //as funny as scrubbing microbes out with clean gloves is - no.
proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool) proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool)
if(!istype(M,/mob/living/carbon)) if(!istype(M))
return 0 return 0
if (user.a_intent == "harm") //check for Hippocratic Oath if (user.a_intent == "harm") //check for Hippocratic Oath
return 0 return 0
if(M.op_stage.in_progress) //Can't operate on someone repeatedly.
user << "\red You can't operate on the patient while surgery is already in progress."
return 1
for(var/datum/surgery_step/S in surgery_steps) for(var/datum/surgery_step/S in surgery_steps)
//check if tool is right or close enough and if this step is possible //check if tool is right or close enough and if this step is possible
if( S.tool_quality(tool) && S.can_use(user, M, user.zone_sel.selecting, tool) && S.is_valid_target(M)) if(S.tool_quality(tool))
var/step_is_valid = S.can_use(user, M, user.zone_sel.selecting, tool)
if(step_is_valid && S.is_valid_target(M))
if(step_is_valid == 2) // This is a failure that already has a message for failing.
return 1
M.op_stage.in_progress = 1
S.begin_step(user, M, user.zone_sel.selecting, tool) //start on it S.begin_step(user, M, user.zone_sel.selecting, tool) //start on it
//We had proper tools! (or RNG smiled.) and user did not move or change hands. //We had proper tools! (or RNG smiled.) and user did not move or change hands.
if( prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration))) if(prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration)))
S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully
else if (tool in user.contents && user.Adjacent(M)) //or else if (tool in user.contents && user.Adjacent(M)) //or
S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~ S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~
else // This failing silently was a pain.
user << "\red You must remain close to your patient to conduct surgery."
M.op_stage.in_progress = 0 // Clear the in-progress flag.
return 1 //don't want to do weapony things after surgery return 1 //don't want to do weapony things after surgery
if (user.a_intent == "help") if (user.a_intent == "help")
user << "\red You can't see any useful way to use [tool] on [M]." user << "\red You can't see any useful way to use [tool] on [M]."
return 1 return 1
@@ -116,6 +129,6 @@ proc/sort_surgeries()
/datum/surgery_status/ /datum/surgery_status/
var/eyes = 0 var/eyes = 0
var/face = 0 var/face = 0
var/appendix = 0
var/head_reattach = 0 var/head_reattach = 0
var/current_organ var/current_organ = "organ"
var/in_progress = 0

View File

@@ -10,7 +10,7 @@
var/list/datum/disease2/effectholder/effects = list() var/list/datum/disease2/effectholder/effects = list()
var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here
var/max_stage = 4 var/max_stage = 4
var/list/affected_species = list("Human","Unathi","Skrell","Tajaran") var/list/affected_species = list("Human","Unathi","Skrell","Tajara")
/datum/disease2/disease/New() /datum/disease2/disease/New()
uniqueID = rand(0,10000) uniqueID = rand(0,10000)

View File

@@ -207,7 +207,6 @@
M.r_hand = G M.r_hand = G
G.layer = 20 G.layer = 20
G.affecting = src G.affecting = src
src.grabbed_by += G
G.synch() G.synch()
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null)) for(var/mob/O in viewers(src, null))

View File

@@ -258,5 +258,8 @@ ALLOW_CULT_GHOSTWRITER
## Sets the minimum number of cultists needed for ghosts to write in blood. ## Sets the minimum number of cultists needed for ghosts to write in blood.
REQ_CULT_GHOSTWRITER 6 REQ_CULT_GHOSTWRITER 6
## Sets the number of available character slots
CHARACTER_SLOTS 10
## Uncomment to use overmap system for zlevel travel ## Uncomment to use overmap system for zlevel travel
#USE_OVERMAP #USE_OVERMAP

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -347,7 +347,7 @@ macro "hotkeymode"
is-disabled = false is-disabled = false
elem elem
name = "T" name = "T"
command = "say" command = ".say"
is-disabled = false is-disabled = false
elem "w_key" elem "w_key"
name = "W+REP" name = "W+REP"

File diff suppressed because it is too large Load Diff

BIN
nano/images/nanomap_z.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 KiB

After

Width:  |  Height:  |  Size: 573 KiB

View File

@@ -80,7 +80,7 @@
<span class='average'><b>Balance</b>:</span> <span class='average'><b>Balance</b>:</span>
</div> </div>
<div class="itemContent"> <div class="itemContent">
${{:helper.formatNumber(money)}} ${{:helper.formatNumber(data.money)}}
</div> </div>
</div> </div>

View File

@@ -65,7 +65,7 @@
<div class="item" style="padding-top: 10px"> <div class="item" style="padding-top: 10px">
{{for data.auth_list}} {{for data.auth_list}}
{{if value.auth_hash}} {{if value.auth_hash}}
{{:helper.link(auth_name, 'eject', {'removeid' : value.auth_hash}, null, 'itemContentWide')}} {{:helper.link(value.auth_name, 'eject', {'removeid' : value.auth_hash}, null, 'itemContentWide')}}
{{else}} {{else}}
{{:helper.link("", 'eject', {'scanid' : 1}, null, 'itemContentWide')}} {{:helper.link("", 'eject', {'scanid' : 1}, null, 'itemContentWide')}}
{{/if}} {{/if}}

View File

@@ -209,7 +209,7 @@
<div class='item' style='width: 100%'> <div class='item' style='width: 100%'>
{{for data.all_centcom_access}} {{for data.all_centcom_access}}
<div class='itemContentWide'> <div class='itemContentWide'>
{{:helper.link(value.desc, '', {'choice' : 'access', 'access_target' : value.ref, 'allowed' : allowed}, null, value.allowed ? 'selected' : null)}} {{:helper.link(value.desc, '', {'choice' : 'access', 'access_target' : value.ref, 'allowed' : value.allowed}, null, value.allowed ? 'selected' : null)}}
</div> </div>
{{/for}} {{/for}}
</div> </div>

BIN
sound/misc/notice1.ogg Normal file

Binary file not shown.

BIN
sound/misc/notice2.ogg Normal file

Binary file not shown.