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.layer = 20
G.affecting = target
target.grabbed_by += G
G.synch()
target.LAssailant = src

View File

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

View File

@@ -47,7 +47,7 @@ turf/c_airblock(turf/other)
#ifdef ZASDBG
ASSERT(isturf(other))
#endif
if(blocks_air)
if(blocks_air || other.blocks_air)
return BLOCKED
//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)
/connection/proc/mark_direct()
if(!direct())
state |= CONNECTION_DIRECT
edge.direct++
//world << "Marked direct."
/connection/proc/mark_indirect()
if(direct())
state &= ~CONNECTION_DIRECT
edge.direct--
//world << "Marked indirect."
/connection/proc/mark_space()
@@ -110,7 +114,6 @@ Class Procs:
erase()
return
else if(block_status & ZONE_BLOCKED)
if(direct())
mark_indirect()
else
mark_direct()

View File

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

View File

@@ -116,7 +116,7 @@
if(!resolved && A && W)
W.afterattack(A,src,1,params) // 1 indicates adjacency
else
UnarmedAttack(A)
UnarmedAttack(A, 1)
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

View File

@@ -247,6 +247,7 @@
mymob.internals.icon_state = "internal0"
mymob.internals.name = "internal"
mymob.internals.screen_loc = ui_internal
hud_elements |= mymob.internals
if(hud_data.has_warnings)
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_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/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.
@@ -494,6 +496,9 @@
if("req_cult_ghostwriter")
config.cult_ghostwriter_req_cultists = text2num(value)
if("character_slots")
config.character_slots = text2num(value)
if("allow_drone_spawn")
config.allow_drone_spawn = text2num(value)

View File

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

View File

@@ -23,9 +23,6 @@
src.cure()
if(stage == 1)
if(affected_mob.op_stage.appendix == 2.0)
// appendix is removed, can't get infected again
src.cure()
if(prob(5))
affected_mob << "\red You feel a stinging pain in your abdomen!"
affected_mob.emote("me",1,"winces slightly.")
@@ -48,7 +45,6 @@
var/mob/living/carbon/human/H = affected_mob
H << "\red Your abdomen is a world of pain!"
H.Weaken(10)
H.op_stage.appendix = 2.0
var/datum/organ/external/groin = H.get_organ("groin")
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/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
var/title = "Attention"
@@ -16,17 +15,17 @@
log = do_log
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)
title = "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)
title = "[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)
title = "Security Announcement"
announcement_type = "Security Announcement"

View File

@@ -94,6 +94,7 @@ var/list/ghostteleportlocs = list()
/*-----------------------------------------------------------------------------*/
/area/space
name = "\improper Space"
icon_state = "space"
requires_power = 1
always_unpowered = 1
lighting_use_dynamic = 1
@@ -708,6 +709,10 @@ var/list/ghostteleportlocs = list()
name = "\improper EVA Maintenance"
icon_state = "maint_eva"
/area/maintenance/dormitory
name = "Dormitory Maintenance"
icon_state = "maint_dormitory"
/area/maintenance/incinerator
name = "\improper Incinerator"
icon_state = "disposal"
@@ -720,13 +725,17 @@ var/list/ghostteleportlocs = list()
name = "Medbay Maintenance"
icon_state = "maint_medbay"
/area/maintenance/misc_research
name = "Misc. Research Maintenance"
icon_state = "maint_misc_research"
/area/maintenance/research_port
name = "Port Research Maintenance"
icon_state = "maint_research_port"
/area/maintenance/research_starboard
name = "Starboard Research Maintenance"
icon_state = "maint_research_starboard"
/area/maintenance/research_shuttle
name = "Research Shuttle Dock Maintenance"
icon_state = "maint_r_shuttle"
icon_state = "maint_research_shuttle"
/area/maintenance/security_port
name = "Port Security Maintenance"
@@ -740,14 +749,6 @@ var/list/ghostteleportlocs = list()
name = "Atmospherics"
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)
/area/maintenance/substation

View File

@@ -32,7 +32,7 @@
M.mutations.Add(mutation)
if(disability)
M.disabilities|=disability
if(mutation)
if(sdisability)
M.sdisabilities|=sdisability
if(activation_message)
M << "\red [activation_message]"
@@ -43,9 +43,9 @@
if(mutation && (mutation in M.mutations))
M.mutations.Remove(mutation)
if(disability)
M.disabilities-=disability
if(mutation)
M.sdisabilities-=sdisability
M.disabilities &= (~disability)
if(sdisability)
M.sdisabilities &= (~sdisability)
if(deactivation_message)
M << "\red [deactivation_message]"
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)
directive += "Some disgruntled NanoTrasen employees have been supportive of our operations. Be wary of any mistreatment by command staff."
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."
if(15)
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)
var/species = M.get_species()
return species == "Tajaran" || species == "Unathi"
return species == "Tajara" || species == "Unathi"
datum/directive/terminations/alien_fraud/get_crew_to_terminate()
var/list/aliens[0]
@@ -30,7 +30,7 @@ datum/directive/terminations/alien_fraud/meets_prerequisites()
var/unathi = 0
for(var/mob/M in player_list)
var/species = M.get_species()
if(species == "Tajaran")
if(species == "Tajara")
tajarans++
if(species == "Unathi")
unathi++

View File

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

View File

@@ -232,8 +232,8 @@ var/global/list/turf/synd_spawn = list()
switch(race)
if("Unathi")
new_suit.species_restricted = list("Unathi")
if("Tajaran")
new_suit.species_restricted = list("Tajaran")
if("Tajara")
new_suit.species_restricted = list("Tajara")
if("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
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)
else if(H.species.name == "Vox")
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
if(findtext(s,"[M.ckey] - All"))
return 1
return 0
#undef WHITELISTFILE

View File

@@ -311,6 +311,9 @@
M:reagents.add_reagent("inaprovaline", 5)
return
proc/toggle_filter()
if(!src.occupant)
filtering = 0
return
if(filtering)
filtering = 0
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.")
else
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(istype(W, /obj/item/stack/cable_coil))
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
/obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob)
return src.attack_hand(user)

View File

@@ -120,7 +120,7 @@
user << "\blue Nothing happens."
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]")
if(air_contents)
var/pressure = air_contents.return_pressure()

View File

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

View File

@@ -11,16 +11,16 @@
var/mode = 0.0
var/printing = null
proc/is_centcom()
return istype(src, /obj/machinery/computer/card/centcom)
/obj/machinery/computer/card/proc/is_centcom()
return 0
proc/is_authenticated()
/obj/machinery/computer/card/proc/is_authenticated()
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"
proc/format_jobs(list/jobs)
/obj/machinery/computer/card/proc/format_jobs(list/jobs)
var/list/formatted = list()
for(var/job in jobs)
formatted.Add(list(list(
@@ -288,3 +288,7 @@
name = "CentCom Identification Computer"
circuit = "/obj/item/weapon/circuitboard/card/centcom"
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.
var/list/departments = list("Engineering","Mining","Medical","Security","Atmos")
//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_species
@@ -622,35 +622,35 @@
model_text = "Engineering"
req_access = list(access_construction)
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
name = "Mining suit cycler"
model_text = "Mining"
req_access = list(access_mining)
departments = list("Mining")
species = list("Human","Tajaran","Skrell","Unathi")
species = list("Human","Tajara","Skrell","Unathi")
/obj/machinery/suit_cycler/security
name = "Security suit cycler"
model_text = "Security"
req_access = list(access_security)
departments = list("Security")
species = list("Human","Tajaran","Skrell","Unathi")
species = list("Human","Tajara","Skrell","Unathi")
/obj/machinery/suit_cycler/medical
name = "Medical suit cycler"
model_text = "Medical"
req_access = list(access_medical)
departments = list("Medical")
species = list("Human","Tajaran","Skrell","Unathi")
species = list("Human","Tajara","Skrell","Unathi")
/obj/machinery/suit_cycler/syndicate
name = "Nonstandard suit cycler"
model_text = "Nonstandard"
req_access = list(access_syndicate)
departments = list("Mercenary")
species = list("Human","Tajaran","Skrell","Unathi")
species = list("Human","Tajara","Skrell","Unathi")
can_repair = 1
/obj/machinery/suit_cycler/attack_ai(mob/user as mob)

View File

@@ -1136,16 +1136,13 @@
M.verbs -= /obj/mecha/proc/move_inside_passenger
/obj/item/mecha_parts/mecha_equipment/tool/passenger/get_equip_info()
var/output = ..()
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
return "[..()] <br />[occupant? "\[Occupant: [occupant]\]|" : ""]Exterior Hatch: <a href='?src=\ref[src];toggle_lock=1'>Toggle Lock</a>"
/obj/item/mecha_parts/mecha_equipment/tool/passenger/Topic(href,href_list)
..()
if (href_list["toggle_lock"])
door_locked = !door_locked
occupant_message("Passenger compartment hatch [door_locked? "locked" : "unlocked"].")
if (chassis)
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!"
if (0)
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
if (pname)
if (!pname)
return
var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P = passengers[pname]
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.log_message("[occupant] was removed.")
occupant_message("\red [occupant] was removed from \the [P] by [user]!")
return
if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card"))
if(!in_range(src, usr)) return

View File

@@ -44,7 +44,7 @@
/* Species-specific sprites, concept stolen from Paradise//vg/.
ex:
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.
*/
@@ -261,6 +261,9 @@
//START HUMAN
var/mob/living/carbon/human/H = M
if(H.species && !(slot in H.species.hud.equip_slots))
return 0
switch(slot)
if(slot_l_hand)
if(H.l_hand)

View File

@@ -69,4 +69,4 @@
/obj/item/device/modkit/tajaran
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."
target_species = "Tajaran"
target_species = "Tajara"

View File

@@ -76,7 +76,7 @@
title+= "[R.title]"
title+= " ([R.req_amount] [src.singular_name]\s)"
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
t1 += text("[]", title)
continue
@@ -112,7 +112,8 @@
recipes_list = srl.recipes
var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])]
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 (R.req_amount*multiplier>1)
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(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)
user.set_machine(src)

View File

@@ -14,7 +14,7 @@ var/global/vox_tick = 1
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/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/device/chameleon(src), slot_l_store)

View File

@@ -159,6 +159,7 @@
log_client_to_db()
send_resources()
nanomanager.send_resources(src)
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")

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
)
var/const/MAX_SAVE_SLOTS = 10
//used for alternate_option
#define GET_RANDOM_JOB 0
#define BE_ASSISTANT 1
@@ -277,15 +275,15 @@ datum/preferences
dat += "<br><b>Custom Loadout:</b> "
var/total_cost = 0
if(isnull(gear) || !islist(gear)) gear = list()
if(!islist(gear)) gear = list()
if(gear && gear.len)
dat += "<br>"
for(var/gear_name in gear)
if(gear_datums[gear_name])
var/datum/gear/G = gear_datums[gear_name]
for(var/i = 1; i <= gear.len; i++)
var/datum/gear/G = gear_datums[gear[i]]
if(G)
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."
else
@@ -294,7 +292,7 @@ datum/preferences
if(total_cost < MAX_GEAR_COST)
dat += " <a href='byond://?src=\ref[user];preference=loadout;task=input'>\[add\]</a>"
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 += "\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
if(C && total_cost <= MAX_GEAR_COST)
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
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")
var/to_remove = href_list["gear"]
if(!to_remove) return
for(var/gear_name in gear)
if(gear_name == to_remove)
gear -= gear_name
break
var/i_remove = text2num(href_list["gear"])
if(i_remove < 1 || i_remove > gear.len) return
gear.Cut(i_remove, i_remove + 1)
else if(href_list["task"] == "clear")
gear.Cut()
else if(href_list["preference"] == "flavor_text")
switch(href_list["task"])
@@ -1187,7 +1185,7 @@ datum/preferences
b_type = new_b_type
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
if(new_hair)
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)
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
if(new_skin)
r_skin = hex2num(copytext(new_skin, 2, 4))
@@ -1622,7 +1620,7 @@ datum/preferences
if(S)
dat += "<b>Select a character slot to load</b><hr>"
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["real_name"] >> name
if(!name) name = "Character[i]"

View File

@@ -1,9 +1,10 @@
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)
var/datum/gear/G = new type()
gear_datums[G.display_name] = G
return 1
/datum/gear
var/display_name //Name/index.
@@ -176,12 +177,14 @@ proc/populate_gear_list()
cost = 2
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
display_name = "headscarf, white"
display_name = "Zhan headscarf"
path = /obj/item/clothing/head/tajaran/scarf
cost = 2
slot = slot_head
// whitelisted = "Tajaran" // It's a headscarf. It isn't even a taj-themed headscarf!
whitelisted = "Tajara"
// Eyes
@@ -281,6 +284,13 @@ proc/populate_gear_list()
cost = 1
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
display_name = "uniform, corporate (Security)"
path = /obj/item/clothing/under/rank/security/corp
@@ -459,7 +469,7 @@ proc/populate_gear_list()
path = /obj/item/clothing/suit/tajaran/furs
cost = 3
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

View File

@@ -62,7 +62,7 @@
lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
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))
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))
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))
@@ -94,7 +94,7 @@
if(!S) return 0
S.cd = "/"
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)
default_slot = slot
S["default_slot"] << slot

View File

@@ -44,7 +44,7 @@
//Set species_restricted list
switch(target_species)
if("Human", "Skrell") //humanoid bodytypes
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
species_restricted = list("exclude","Unathi","Tajara","Diona","Vox")
else
species_restricted = list(target_species)
@@ -63,9 +63,9 @@
//Set species_restricted list
switch(target_species)
if("Skrell")
species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
species_restricted = list("exclude","Unathi","Tajara","Diona","Vox")
if("Human")
species_restricted = list("exclude","Skrell","Unathi","Tajaran","Diona","Vox")
species_restricted = list("exclude","Skrell","Unathi","Tajara","Diona","Vox")
else
species_restricted = list(target_species)
@@ -177,7 +177,7 @@ BLIND // can't see anything
body_parts_covered = HANDS
slot_flags = SLOT_GLOVES
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')
/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."
if("exclude" in species_restricted)
species_restricted -= "Unathi"
species_restricted -= "Tajaran"
species_restricted -= "Tajara"
return
//Head
@@ -248,7 +248,7 @@ BLIND // can't see anything
permeability_coefficient = 0.50
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')
//Suit

View File

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

View File

@@ -253,3 +253,12 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
siemens_coefficient = 2.0
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
//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(
"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',
)
sprite_sheets_obj = list(
"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',
)
@@ -64,15 +64,15 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
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(
"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',
)
sprite_sheets_obj = list(
"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',
)
@@ -364,7 +364,7 @@
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
siemens_coefficient = 0.6
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)
@@ -392,7 +392,7 @@
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)
siemens_coefficient = 0.6
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox")
species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox")
//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."
icon = 'icons/obj/custom_items.dmi'
icon_state = "harper_uniform"
item_state = "harper_uniform"
item_state = "jensensuit"
item_color = "harper_uniform"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
//////////////////// Layla's Dress - Layla Davies-Halabi - sabirm ///////////////

View File

@@ -57,7 +57,7 @@
set category = "Object"
set name = "Draw"
set desc = "Draw a card from a deck."
set src in oview(1)
set src in view(1)
if(usr.stat || !Adjacent(usr)) return
@@ -93,6 +93,7 @@
set category = "Object"
set name = "Deal"
set desc = "Deal a card from a deck."
set src in view(1)
if(usr.stat || !Adjacent(usr)) return
@@ -101,28 +102,35 @@
return
var/list/players = list()
for(var/mob/living/player in orange(3))
for(var/mob/living/player in viewers(3))
if(!player.stat)
players += player
players -= usr
//players -= usr
var/mob/living/M = input("Who do you wish to deal a card?") as null|anything in players
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]
cards -= cards[1]
H.concealed = 1
H.update_icon()
usr.visible_message("\The [usr] deals a card to \the [M].")
H.throw_at(get_step(M,M.dir),10,1,H)
if(user==target)
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)
if(istype(O,/obj/item/weapon/hand))
var/obj/item/weapon/hand/H = O
for(var/datum/playingcard/P in H.cards)
cards += P
src.concealed = H.concealed
del(O)
user.put_in_hands(src)
update_icon()
@@ -139,6 +147,18 @@
cards = newcards
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
name = "hand of cards"
desc = "Some playing cards."
@@ -170,6 +190,7 @@
cards -= card
H.concealed = 0
H.update_icon()
src.update_icon()
usr.visible_message("\The [usr] plays \the [discarding].")
H.loc = get_step(usr,usr.dir)
@@ -188,7 +209,7 @@
for(var/datum/playingcard/P in cards)
usr << "The [P.name]."
/obj/item/weapon/hand/update_icon()
/obj/item/weapon/hand/update_icon(var/direction = 0)
if(!cards.len)
del(src)
@@ -211,12 +232,43 @@
overlays += I
return
var/origin = -12
var/offset = Floor(32/cards.len)
var/offset = Floor(20/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
for(var/datum/playingcard/P in cards)
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
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)
following = null
dir = direct
if(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.loc = pick(L)
following = null
/mob/dead/observer/verb/follow()
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
src << "\blue Now following [target]"
spawn(0)
var/turf/pos = get_turf(src)
while(loc == pos && target && following == target && client)
while(target && following == target && client)
var/turf/T = get_turf(target)
if(!T)
break
// To stop the ghost flickering.
if(loc != T)
loc = T
pos = loc
sleep(15)
following = null
/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
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.
A.loc = T
following = null
else
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.
/datum/species/xenos
name = "Xenomorph"
name_plural = "Xenomorphs"
default_language = "Xenomorph"
language = "Hivemind"
unarmed_type = /datum/unarmed_attack/claws/strong
@@ -40,7 +42,6 @@
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel,
"hive node" = /datum/organ/internal/xenos/hivenode,
@@ -116,7 +117,6 @@
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen,
"acid gland" = /datum/organ/internal/xenos/acidgland,
@@ -155,7 +155,6 @@
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/hunter,
"hive node" = /datum/organ/internal/xenos/hivenode,
@@ -183,7 +182,6 @@
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/sentinel,
"acid gland" = /datum/organ/internal/xenos/acidgland,
@@ -214,7 +212,6 @@
has_organ = list(
"heart" = /datum/organ/internal/heart,
"lungs" = /datum/organ/internal/lungs,
"brain" = /datum/organ/internal/brain/xeno,
"egg sac" = /datum/organ/internal/xenos/eggsac,
"plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen,

View File

@@ -1210,7 +1210,7 @@
src << msg
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
src.adjustToxLoss(rand(1,3))

View File

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

View File

@@ -12,7 +12,7 @@
/mob/living/carbon/human/tajaran/New(var/new_loc)
h_style = "Tajaran Ears"
..(new_loc, "Tajaran")
..(new_loc, "Tajara")
/mob/living/carbon/human/unathi/New(var/new_loc)
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)
if (G.loc == source && G.state >= GRAB_AGGRESSIVE)
grabbing = 1
break
if (!grabbing)
slot_to_process = null
source << "\red Your grasp was broken before you could restrain [target]!"

View File

@@ -5,6 +5,7 @@
/datum/species
var/name // Species name.
var/name_plural
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.
@@ -202,6 +203,7 @@
/datum/species/human
name = "Human"
name_plural = "Humans"
language = "Sol Common"
primitive = /mob/living/carbon/monkey
unarmed_type = /datum/unarmed_attack/punch
@@ -213,6 +215,7 @@
/datum/species/unathi
name = "Unathi"
name_plural = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
language = "Sinta'unathi"
@@ -239,7 +242,8 @@
base_color = "#066000"
/datum/species/tajaran
name = "Tajaran"
name = "Tajara"
name_plural = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
language = "Siik'tajr"
@@ -264,6 +268,7 @@
/datum/species/skrell
name = "Skrell"
name_plural = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
language = "Skrellian"
@@ -278,6 +283,7 @@
/datum/species/vox
name = "Vox"
name_plural = "Vox"
icobase = 'icons/mob/human_races/r_vox.dmi'
deform = 'icons/mob/human_races/r_def_vox.dmi'
default_language = "Vox-pidgin"
@@ -324,6 +330,7 @@
/datum/species/vox/armalis
name = "Vox Armalis"
name_plural = "Vox"
icobase = 'icons/mob/human_races/r_armalis.dmi'
deform = 'icons/mob/human_races/r_armalis.dmi'
rarity_value = 10
@@ -364,6 +371,7 @@
/datum/species/diona
name = "Diona"
name_plural = "Dionaea"
icobase = 'icons/mob/human_races/r_diona.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi'
language = "Rootspeak"
@@ -428,6 +436,8 @@
/datum/species/machine
name = "Machine"
name_plural = "machines"
icobase = 'icons/mob/human_races/r_machine.dmi'
deform = 'icons/mob/human_races/r_machine.dmi'
language = "Tradeband"
@@ -467,9 +477,11 @@
if(H.a_intent != "hurt")
return 0
if(unarmed.shredding && unarmed.is_usable(H))
if(unarmed.is_usable(H))
if(unarmed.shredding)
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 0
@@ -502,7 +514,7 @@
/datum/unarmed_attack/bite
attack_verb = list("bite") // 'x has biteed y', needs work.
attack_sound = 'sound/weapons/bite.ogg'
shredding = 1
shredding = 0
damage = 5
sharp = 1
edge = 1
@@ -551,6 +563,7 @@
var/has_throw = 1 // Set to draw throw button.
var/has_resist = 1 // Set to draw resist 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
// 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"),
"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)
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
// 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
damage_icon_parts["[damage_state]/[body_part]"] = DI
return DI

View File

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

View File

@@ -245,7 +245,7 @@ var/list/ai_verbs_default = list(
//if(icon_state == initial(icon_state))
var/icontype = ""
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)
if("Custom") icon_state = "[src.ckey]-ai"
if("Rainbow") icon_state = "ai-clown"
@@ -266,6 +266,7 @@ var/list/ai_verbs_default = list(
if("Soviet") icon_state = "ai-redoctober"
if("Trapped") icon_state = "ai-hades"
if("Heartline") icon_state = "ai-heartline"
if("Chatterbox") icon_state = "ai-president"
else icon_state = "ai"
//else
//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.
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))
wrapped.loc = src
else

View File

@@ -861,6 +861,8 @@ var/list/robot_verbs_default = list(
spark_system.start()
return ..()
/mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M as mob)
if (!ticker)
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 |= B
var/datum/organ/external/affecting = H.get_organ("head")
affecting.implants -= src
var/s2h_id = src.computer_id
var/s2h_ip= src.lastKnownIP
src.computer_id = null

View File

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

View File

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

View File

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

View File

@@ -8,10 +8,14 @@ mob/var/last_typed_time
var/global/image/typing_indicator
/mob/proc/set_typing_indicator(var/state)
if(client)
if(!(client.prefs.toggles & SHOW_TYPING))
if(!typing_indicator)
typing_indicator = image('icons/mob/talk.dmi',null,"typing")
if(client)
if(client.prefs.toggles & SHOW_TYPING)
overlays -= typing_indicator
else
if(state)
if(!typing)
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."
prefs.toggles ^= SHOW_TYPING
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!

View File

@@ -27,7 +27,8 @@
filenames = flist(path)
for(var/filename in filenames)
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

View File

@@ -32,7 +32,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
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, \
"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
/mob/living/carbon/human/proc/handle_blood()

View File

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

View File

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

View File

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

View File

@@ -66,13 +66,13 @@
// 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.
/obj/item/device/camera/siliconcam/proc/deletepicture(obj/item/device/camera/siliconcam/cam)
var/datum/picture/selection = selectpicture(cam)
/obj/item/device/camera/siliconcam/proc/deletepicture()
var/datum/picture/selection = selectpicture()
if(!selection)
return
cam.aipictures -= selection
aipictures -= selection
usr << "<span class='unconscious'>Image deleted</span>"
/obj/item/device/camera/siliconcam/ai_camera/can_capture_turf(turf/T, mob/user)
@@ -147,7 +147,12 @@
set src in usr
// 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()
if(istype(src.loc, /mob/living/silicon/ai))

View File

@@ -21,7 +21,7 @@
icon_state = "bbox_on"
// 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)
/obj/machinery/power/breakerbox/examine()

View File

@@ -67,6 +67,7 @@ var/global/list/rad_collectors = list()
src.P = W
W.loc = src
update_icons()
return 1
else if(istype(W, /obj/item/weapon/crowbar))
if(P && !src.locked)
eject()
@@ -84,6 +85,7 @@ var/global/list/rad_collectors = list()
connect_to_network()
else
disconnect_from_network()
return 1
else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if (src.allowed(user))
if(active)
@@ -95,9 +97,7 @@ var/global/list/rad_collectors = list()
else
user << "\red Access denied!"
return 1
else
..()
return 1
return ..()
/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)
busy = 0
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
src.updateUsrDialog()
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
//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)
switch(level)
@@ -21,7 +23,7 @@
if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level)
switch(level)
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
for(var/obj/machinery/firealarm/FA in machines)
if(FA.z == 1 || FA.z == 5)
@@ -29,9 +31,9 @@
FA.overlays += image('icons/obj/monitors.dmi', "overlay_green")
if(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
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
for(var/obj/machinery/firealarm/FA in machines)
if(FA.z == 1 || FA.z == 5)
@@ -39,9 +41,9 @@
FA.overlays += image('icons/obj/monitors.dmi', "overlay_blue")
if(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
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
/* - 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")
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
for(var/obj/machinery/firealarm/FA in machines)
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].",)
//Could be cleaner ...
affected.open = 1
if(istype(target) && !(target.species.flags & NO_BLOOD))
affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1)
affected.clamp()
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].", \
"\blue You have constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].",)
affected.open = 1
if(istype(target) && !(target.species.flags & NO_BLOOD))
affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1)
affected.clamp()
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].", \
"\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",)
affected.open = 1
if(istype(target) && !(target.species.flags & NO_BLOOD))
affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1)
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
// 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"])
target.vessel.trans_to(O, 5, 1, 1)
@@ -367,7 +367,7 @@
if(!target.species)
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_a = (O.gender == PLURAL) ? "" : "a "
@@ -377,22 +377,22 @@
if(!O.health)
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])
organ_missing = 1
else
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)
organ_compatible = 1
else
user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.display_name]."
return 0
return 2
else
user << "\red \A [target.species.name] doesn't normally have [o_a][O.organ_tag]."
return 0
user << "\red You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag]."
return 2
return ..() && organ_missing && organ_compatible
@@ -412,7 +412,7 @@
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)
O.organ_data.transplant_data = list()
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.
proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool)
if(!istype(M,/mob/living/carbon))
proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool)
if(!istype(M))
return 0
if (user.a_intent == "harm") //check for Hippocratic Oath
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)
//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
//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)))
S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully
else if (tool in user.contents && user.Adjacent(M)) //or
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
if (user.a_intent == "help")
user << "\red You can't see any useful way to use [tool] on [M]."
return 1
@@ -116,6 +129,6 @@ proc/sort_surgeries()
/datum/surgery_status/
var/eyes = 0
var/face = 0
var/appendix = 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/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/list/affected_species = list("Human","Unathi","Skrell","Tajaran")
var/list/affected_species = list("Human","Unathi","Skrell","Tajara")
/datum/disease2/disease/New()
uniqueID = rand(0,10000)

View File

@@ -207,7 +207,6 @@
M.r_hand = G
G.layer = 20
G.affecting = src
src.grabbed_by += G
G.synch()
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
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.
REQ_CULT_GHOSTWRITER 6
## Sets the number of available character slots
CHARACTER_SLOTS 10
## Uncomment to use overmap system for zlevel travel
#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
elem
name = "T"
command = "say"
command = ".say"
is-disabled = false
elem "w_key"
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>
</div>
<div class="itemContent">
${{:helper.formatNumber(money)}}
${{:helper.formatNumber(data.money)}}
</div>
</div>

View File

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

View File

@@ -209,7 +209,7 @@
<div class='item' style='width: 100%'>
{{for data.all_centcom_access}}
<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>
{{/for}}
</div>

BIN
sound/misc/notice1.ogg Normal file

Binary file not shown.

BIN
sound/misc/notice2.ogg Normal file

Binary file not shown.