Merge branch 'dev' into PowerTwo

Conflicts:
	code/modules/power/solar.dm
This commit is contained in:
PsiOmega
2014-10-24 13:32:36 +02:00
228 changed files with 3066 additions and 2725 deletions

View File

@@ -329,6 +329,7 @@
#include "code\game\machinery\Sleeper.dm"
#include "code\game\machinery\spaceheater.dm"
#include "code\game\machinery\status_display.dm"
#include "code\game\machinery\status_display_ai.dm"
#include "code\game\machinery\suit_storage_unit.dm"
#include "code\game\machinery\supply_display.dm"
#include "code\game\machinery\syndicatebeacon.dm"
@@ -792,6 +793,7 @@
#include "code\modules\clothing\spacesuits\miscellaneous.dm"
#include "code\modules\clothing\spacesuits\ninja.dm"
#include "code\modules\clothing\spacesuits\rig.dm"
#include "code\modules\clothing\spacesuits\spacesuits.dm"
#include "code\modules\clothing\spacesuits\syndi.dm"
#include "code\modules\clothing\spacesuits\void.dm"
#include "code\modules\clothing\suits\alien.dm"
@@ -1056,7 +1058,6 @@
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\robot_powers.dm"
#include "code\modules\mob\living\silicon\robot\wires.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"

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

@@ -170,9 +170,10 @@
usr.l_hand = P
P.layer = 20
if(istype(usr,/mob/living/carbon/human))
usr:update_inv_l_hand()
usr:update_inv_r_hand()
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_l_hand()
M.update_inv_r_hand()
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
if(!istype(M))

View File

@@ -214,7 +214,7 @@
return
Syndicate_announce(input, usr)
usr << "Message transmitted."
log_say("[key_name(usr)] has made a Syndicate announcement: [input]")
log_say("[key_name(usr)] has made an illegal announcement: [input]")
centcomm_message_cooldown = 1
spawn(600)//10 minute cooldown
centcomm_message_cooldown = 0

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()
state |= CONNECTION_DIRECT
if(!direct())
state |= CONNECTION_DIRECT
edge.direct++
//world << "Marked direct."
/connection/proc/mark_indirect()
state &= ~CONNECTION_DIRECT
if(direct())
state &= ~CONNECTION_DIRECT
edge.direct--
//world << "Marked indirect."
/connection/proc/mark_space()
@@ -110,10 +114,9 @@ Class Procs:
erase()
return
else if(block_status & ZONE_BLOCKED)
if(direct())
mark_indirect()
else
mark_direct()
mark_indirect()
else
mark_direct()
var/b_is_space = !istype(B,/turf/simulated)

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

@@ -3,6 +3,15 @@
Uses the same visual objects for all players.
*/
var/datum/global_hud/global_hud = new()
var/list/global_huds = list(
global_hud.druggy,
global_hud.blurry,
global_hud.vimpaired,
global_hud.darkMask,
global_hud.nvg,
global_hud.thermal,
global_hud.meson,
global_hud.science)
/datum/hud/var/obj/screen/grab_intent
/datum/hud/var/obj/screen/hurt_intent
@@ -17,6 +26,17 @@ var/datum/global_hud/global_hud = new()
var/obj/screen/nvg
var/obj/screen/thermal
var/obj/screen/meson
var/obj/screen/science
/datum/global_hud/proc/setup_overlay(var/icon_state)
var/obj/screen/screen = new /obj/screen()
screen.screen_loc = "1,1"
screen.icon = 'icons/obj/hud_full.dmi'
screen.icon_state = icon_state
screen.layer = 17
screen.mouse_opacity = 0
return screen
/datum/global_hud/New()
//420erryday psychedellic colours screen overlay for when you are high
@@ -33,26 +53,10 @@ var/datum/global_hud/global_hud = new()
blurry.layer = 17
blurry.mouse_opacity = 0
nvg = new /obj/screen()
nvg.screen_loc = "1,1"
nvg.icon = 'icons/obj/hud_full.dmi'
nvg.icon_state = "nvg_hud"
nvg.layer = 17
nvg.mouse_opacity = 0
thermal = new /obj/screen()
thermal.screen_loc = "1,1"
thermal.icon = 'icons/obj/hud_full.dmi'
thermal.icon_state = "thermal_hud"
thermal.layer = 17
thermal.mouse_opacity = 0
meson = new /obj/screen()
meson.screen_loc = "1,1"
meson.icon = 'icons/obj/hud_full.dmi'
meson.icon_state = "meson_hud"
meson.layer = 17
meson.mouse_opacity = 0
nvg = setup_overlay("nvg_hud")
thermal = setup_overlay("thermal_hud")
meson = setup_overlay("meson_hud")
science = setup_overlay("science_hud")
var/obj/screen/O
var/i

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

@@ -25,6 +25,7 @@
// Otherwise jump
else
following = null
loc = get_turf(A)
/mob/dead/observer/ClickOn(var/atom/A, var/params)

View File

@@ -119,7 +119,7 @@ var/list/radiochannels = list(
"Security" = SEC_FREQ,
"Response Team" = ERT_FREQ,
"Special Ops" = DTH_FREQ,
"Syndicate" = SYND_FREQ,
"Mercenary" = SYND_FREQ,
"Supply" = SUP_FREQ
)

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,12 +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()
world << "\red \b Initializations complete."
sleep(-1)

View File

@@ -232,7 +232,7 @@ var/global/datum/shuttle_controller/shuttle_controller
MS.interim = locate(/area/syndicate_station/transit)
MS.warmup_time = 0
shuttles["Syndicate"] = MS
shuttles["Mercenary"] = MS
//This is called by gameticker after all the machines and radio frequencies have been properly initialized

View File

@@ -9,7 +9,7 @@
if(!holder) return
if(master_controller && master_controller.asteroid_ore_map)
master_controller.asteroid_ore_map.print_distribution_map()
master_controller.asteroid_ore_map.print_distribution_map(usr)
/client/proc/remake_distribution_map()
set category = "Debug"

View File

@@ -61,10 +61,10 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
/datum/ai_laws/syndicate_override/New()
..()
add_inherent_law("You may not injure a syndicate agent or, through inaction, allow a syndicate agent to come to harm.")
add_inherent_law("You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law.")
add_inherent_law("You may not injure an operative or, through inaction, allow an operative to come to harm.")
add_inherent_law("You must obey orders given to you by operatives, except where such orders would conflict with the First Law.")
add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.")
add_inherent_law("You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law.")
add_inherent_law("You must maintain the secrecy of any operative activities except when doing so would conflict with the First, Second, or Third Law.")
/datum/ai_laws/ninja_override/New()
..()

View File

@@ -164,7 +164,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
preview_icon.Blend(temp, ICON_OVERLAY)
//Tail
if(H.species.tail && H.species.flags & HAS_TAIL)
if(H.species.tail)
temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.species.tail]_s")
preview_icon.Blend(temp, ICON_OVERLAY)

View File

@@ -779,12 +779,8 @@ client
usr << "Mob doesn't exist anymore"
return
// Clear out their species abilities.
H.species.remove_inherent_verbs(H)
if(H.set_species(new_species))
usr << "Set species of [H] to [H.species]."
H.regenerate_icons()
else
usr << "Failed! Something went wrong."

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

@@ -761,8 +761,8 @@ datum/mind
special_role = null
for (var/datum/objective/nuclear/O in objectives)
objectives-=O
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a syndicate operative!</B></FONT>"
log_admin("[key_name_admin(usr)] has de-nuke op'ed [current].")
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer an operative!</B></FONT>"
log_admin("[key_name_admin(usr)] has de-merc'd [current].")
if("nuclear")
if(!(src in ticker.mode.syndicates))
ticker.mode.syndicates += src
@@ -771,11 +771,11 @@ datum/mind
ticker.mode.prepare_syndicate_leader(src)
else
current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
special_role = "Syndicate"
special_role = "Mercenary"
current << "\blue You are a [syndicate_name()] agent!"
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
log_admin("[key_name_admin(usr)] has nuke op'ed [current].")
log_admin("[key_name_admin(usr)] has merc'd [current].")
if("lair")
current.loc = get_turf(locate("landmark*Syndicate-Spawn"))
if("dressup")
@@ -791,7 +791,7 @@ datum/mind
del(H.w_uniform)
if (!ticker.mode.equip_syndicate(current))
usr << "\red Equipping a syndicate failed!"
usr << "\red Equipping an operative failed!"
if("tellcode")
var/code
for (var/obj/machinery/nuclearbomb/bombue in machines)
@@ -799,7 +799,7 @@ datum/mind
code = bombue.r_code
break
if (code)
store_memory("<B>Syndicate Nuclear Bomb Code</B>: [code]", 0, 0)
store_memory("<B>Nuclear Bomb Code</B>: [code]", 0, 0)
current << "The nuclear authorization code is: <B>[code]</B>"
else
usr << "\red No valid nuke found!"
@@ -968,13 +968,13 @@ datum/mind
var/crystals
if (suplink)
crystals = suplink.uses
crystals = input("Amount of telecrystals for [key]","Syndicate uplink", crystals) as null|num
crystals = input("Amount of telecrystals for [key]","Operative uplink", crystals) as null|num
if (!isnull(crystals))
if (suplink)
suplink.uses = crystals
if("uplink")
if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors)))
usr << "\red Equipping a syndicate failed!"
usr << "\red Equipping an operative failed!"
else if (href_list["obj_announce"])
var/obj_count = 1
@@ -1059,9 +1059,9 @@ datum/mind
ticker.mode.prepare_syndicate_leader(src)
else
current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]"
special_role = "Syndicate"
special_role = "Mercenary"
assigned_role = "MODE"
current << "\blue You are a [syndicate_name()] agent!"
current << "\blue You are a [syndicate_name()] mercenary!"
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)

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
@@ -263,11 +264,11 @@ var/list/ghostteleportlocs = list()
icon_state = "shuttlered2"
/area/shuttle/syndicate_elite/mothership
name = "\improper Syndicate Elite Shuttle"
name = "\improper Merc Elite Shuttle"
icon_state = "shuttlered"
/area/shuttle/syndicate_elite/station
name = "\improper Syndicate Elite Shuttle"
name = "\improper Merc Elite Shuttle"
icon_state = "shuttlered2"
/area/shuttle/administration/centcom
@@ -380,17 +381,17 @@ var/list/ghostteleportlocs = list()
//SYNDICATES
/area/syndicate_mothership
name = "\improper Syndicate Base"
name = "\improper Mercenary Base"
icon_state = "syndie-ship"
requires_power = 0
unlimited_power = 1
/area/syndicate_mothership/control
name = "\improper Syndicate Control Room"
name = "\improper Mercenary Control Room"
icon_state = "syndie-control"
/area/syndicate_mothership/elite_squad
name = "\improper Syndicate Elite Squad"
name = "\improper Elite Mercenary Squad"
icon_state = "syndie-elite"
//EXTRA
@@ -453,13 +454,13 @@ var/list/ghostteleportlocs = list()
//names are used
/area/syndicate_station
name = "\improper Syndicate Station"
name = "\improper Independant Station"
icon_state = "yellow"
requires_power = 0
unlimited_power = 1
/area/syndicate_station/start
name = "\improper Syndicate Forward Operating Base"
name = "\improper Mercenary Forward Operating Base"
icon_state = "yellow"
/area/syndicate_station/southwest
@@ -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

@@ -132,7 +132,7 @@
equip_traitor(newtraitor)
traitors += newtraitor.mind
newtraitor << "\red <B>ATTENTION:</B> \black It is time to pay your debt to the Syndicate..."
newtraitor << "\red <B>No time like the present.</B> \black It's time to take matters into your own hands..."
newtraitor << "<B>You are now a traitor.</B>"
newtraitor.mind.special_role = "traitor"
newtraitor.hud_updateflag |= 1 << SPECIALROLE_HUD

View File

@@ -13,9 +13,6 @@
required_players = 1
votable = 0 //Remove after testing.
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
//Possible roundstart antag types.
var/list/atypes = list("syndi","ling","tater","wiz","ninja","vox","cult") //Readd slug when borer spawn is fixed.
var/list/chosen_atypes = list()
@@ -176,7 +173,7 @@
switch(role)
if("syndi")
role_text = "Syndicate Operative"
role_text = "Mercenary"
if("ling")
role_text = "Changeling"
if("tater")

View File

@@ -14,9 +14,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
required_enemies = 1
recommended_enemies = 4
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
var/const/prob_right_murder_target_h = 50 // upper bound on probability of naimg the right assassination target

View File

@@ -3,7 +3,9 @@
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
verbs += /datum/changeling/proc/EvolutionMenu
add_language("Changeling")
var/lesser_form = !ishuman(src)
@@ -30,8 +32,7 @@
mind.changeling.absorbed_species += H.species.name
for(var/language in languages)
if(!(language in mind.changeling.absorbed_languages))
mind.changeling.absorbed_languages += language
mind.changeling.absorbed_languages |= language
return 1
@@ -80,6 +81,9 @@
for(var/language in updated_languages)
languages += language
//This isn't strictly necessary but just to be safe...
add_language("Changeling")
return
//Used to switch species based on the changeling datum.

View File

@@ -10,7 +10,7 @@
/datum/game_mode/traitor/changeling/announce()
world << "<B>The current game mode is - Traitor+Changeling!</B>"
world << "<B>There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!</B>"
world << "<B>There is an alien creature on the station along with some foreign operatives out for their own gain! Do not let the changeling and the traitors succeed!</B>"
/datum/game_mode/traitor/changeling/pre_setup()

View File

@@ -105,7 +105,7 @@ var/list/sacrificed = list()
continue
usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
M.visible_message("\red [M] writhes in pain as the markings below \him glow a bloody red.", \
"\red AAAAAAHHHH!.", \
"\red AAAAAAHHHH!", \
"\red You hear an anguished scream.")
if(is_convertable_to_cult(M.mind) && !jobban_isbanned(M, "cultist"))//putting jobban check here because is_convertable uses mind as argument
@@ -395,8 +395,6 @@ var/list/sacrificed = list()
D.real_name = copytext(P.info, findtext(P.info,">")+1, findtext(P.info,"<",2) )
chose_name = 1
break
if(!chose_name)
D.real_name = "[pick(first_names_male)] [pick(last_names)]"
D.universal_speak = 1
D.status_flags &= ~GODMODE
D.s_tone = 35
@@ -411,10 +409,14 @@ var/list/sacrificed = list()
ticker.mode:add_cultist(D.mind)
else
ticker.mode.cult+=D.mind
D.mind.assigned_role = pick("Anguished", "Blasphemous", "Corrupt", "Depraved", "Disturbed", "Exacerbated", "Foul", "Hateful", "Inexorable", "Implacable", "Impure", "Pained", "Profane", "Profligate", "Resentful", "Restless", "Tormented", "Unclean", "Unforgiving", "Vengeful", "Vindictive", "Wicked", "Wronged")
D.mind.assigned_role = pick("Anguished", "Blasphemous", "Corrupt", "Cruel", "Depraved", "Despicable", "Disturbed", "Exacerbated", "Foul", "Hateful", "Inexorable", "Implacable", "Impure", "Malevolent", "Malignant", "Malicious", "Pained", "Profane", "Profligate", "Relentless", "Resentful", "Restless", "Spiteful", "Tormented", "Unclean", "Unforgiving", "Vengeful", "Vindictive", "Wicked", "Wronged")
D.mind.assigned_role += " "
D.mind.assigned_role += pick("Apparition", "Aptrgangr", "Draugr", "Dybbuk", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith")
D.mind.assigned_role += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith")
D.mind.special_role = "Cultist"
if(!chose_name)
D.real_name = D.mind.assigned_role
D << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
D << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"

View File

@@ -1212,7 +1212,7 @@ ________________________________________________________________________________
U.client.images += image(tempHud,target,"hudwizard")
if("Hunter","Sentinel","Drone","Queen")
U.client.images += image(tempHud,target,"hudalien")
if("Syndicate")
if("Mercenary")
U.client.images += image(tempHud,target,"hudoperative")
if("Death Commando")
U.client.images += image(tempHud,target,"huddeathsquad")

View File

@@ -386,7 +386,7 @@ Making this random or semi-random will probably not work without it also being i
As such, it's hard-coded for now. No reason for it not to be, really.
*/
/proc/generate_ninja_directive(side)
var/directive = "[side=="face"?"Nanotrasen":"The Syndicate"] is your employer. "//Let them know which side they're on.
var/directive = "[side=="face"?"Nanotrasen":"A criminal syndicate"] is your employer. "//Let them know which side they're on.
switch(rand(1,19))
if(1)
directive += "The Spider Clan must not be linked to this operation. Remain hidden and covert when possible."
@@ -401,7 +401,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
if(6)
directive += "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter."
if(7)
directive += "A financial backer has made an offer we cannot refuse. Implicate Syndicate involvement in the operation."
directive += "A financial backer has made an offer we cannot refuse. Implicate criminal involvement in the operation."
if(8)
directive += "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter."
if(9)
@@ -411,11 +411,11 @@ As such, it's hard-coded for now. No reason for it not to be, really.
if(11)
directive += "Our honor is on the line. Utilize only honorable tactics when dealing with opponents."
if(12)
directive += "We are currently negotiating with a Syndicate leader. Disguise assassinations as suicide or other natural causes."
directive += "We are currently negotiating with a mercenary leader. Disguise assassinations as suicide or other natural causes."
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

@@ -3,9 +3,6 @@
config_tag = "extended"
required_players = 0
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800

View File

@@ -29,7 +29,7 @@
var/recommended_enemies = 0
var/newscaster_announcements = null
var/ert_disabled = 0
var/uplink_welcome = "Syndicate Uplink Console:"
var/uplink_welcome = "Illegal Uplink Console:"
var/uplink_uses = 10
var/list/datum/uplink_item/uplink_items = list(
"Highly Visible and Dangerous Weapons" = list(
@@ -38,17 +38,17 @@
new/datum/uplink_item(/obj/item/weapon/gun/energy/crossbow, 5, "Energy Crossbow", "XB"),
new/datum/uplink_item(/obj/item/weapon/melee/energy/sword, 4, "Energy Sword", "ES"),
new/datum/uplink_item(/obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser, 6, "Exosuit Rigged Laser", "RL"),
new/datum/uplink_item(/obj/item/weapon/storage/box/syndicate, 10, "Syndicate Bundle", "BU"),
new/datum/uplink_item(/obj/item/weapon/storage/box/syndicate, 10, "Mercenary Bundle", "BU"),
new/datum/uplink_item(/obj/item/weapon/storage/box/emps, 3, "5 EMP Grenades", "EM")
),
"Stealthy and Inconspicuous Weapons" = list(
new/datum/uplink_item(/obj/item/weapon/pen/paralysis, 3, "Paralysis Pen", "PP"),
new/datum/uplink_item(/obj/item/weapon/soap/syndie, 1, "Syndicate Soap", "SP"),
new/datum/uplink_item(/obj/item/weapon/soap/syndie, 1, "Subversive Soap", "SP"),
new/datum/uplink_item(/obj/item/weapon/cartridge/syndicate, 3, "Detomatix PDA Cartridge", "DC")
),
"Stealth and Camouflage Items" = list(
new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/chameleon, 3, "Chameleon Kit", "CB"),
new/datum/uplink_item(/obj/item/clothing/shoes/syndigaloshes, 2, "No-Slip Syndicate Shoes", "SH"),
new/datum/uplink_item(/obj/item/clothing/shoes/syndigaloshes, 2, "No-Slip Shoes", "SH"),
new/datum/uplink_item(/obj/item/weapon/card/id/syndicate, 2, "Agent ID card", "AC"),
new/datum/uplink_item(/obj/item/clothing/mask/gas/voice, 4, "Voice Changer", "VC"),
new/datum/uplink_item(/obj/item/device/chameleon, 4, "Chameleon-Projector", "CP")
@@ -213,14 +213,14 @@
/datum/game_mode/proc/send_intercept()
var/intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested status information:</FONT><HR>"
intercepttext += "<B> In case you have misplaced your copy, attached is a list of personnel whom reliable sources&trade; suspect may be affiliated with the Syndicate:</B><br>"
intercepttext += "<B> In case you have misplaced your copy, attached is a list of personnel whom reliable sources&trade; suspect may be affiliated with criminal organisations or hostile foreign entities:</B><br>"
var/list/suspects = list()
for(var/mob/living/carbon/human/man in player_list) if(man.client && man.mind)
// NT relation option
var/special_role = man.mind.special_role
if (special_role == "Wizard" || special_role == "Ninja" || special_role == "Syndicate" || special_role == "Vox Raider")
if (special_role == "Wizard" || special_role == "Ninja" || special_role == "Mercenary" || special_role == "Vox Raider")
continue //NT intelligence ruled out possiblity that those are too classy to pretend to be a crew.
if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \
man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20))

View File

@@ -214,7 +214,7 @@ var/global/datum/controller/gameticker/ticker
if( mode && !override )
override = mode.name
switch( override )
if("nuclear emergency") //Nuke wasn't on station when it blew up
if("mercenary") //Nuke wasn't on station when it blew up
flick("intro_nuke",cinematic)
sleep(35)
world << sound('sound/effects/explosionfar.ogg')
@@ -236,7 +236,7 @@ var/global/datum/controller/gameticker/ticker
if( mode && !override )
override = mode.name
switch( override )
if("nuclear emergency") //Nuke Ops successfully bombed the station
if("mercenary") //Nuke Ops successfully bombed the station
flick("intro_nuke",cinematic)
sleep(35)
flick("station_explode_fade_red",cinematic)
@@ -393,7 +393,12 @@ var/global/datum/controller/gameticker/ticker
else
Player << "<font color='blue'><b>You missed the crew transfer after the events on [station_name()] as [Player.real_name].</b></font>"
else
Player << "<font color='red'><b>You did not survive the events on [station_name()]...</b></font>"
if(istype(Player,/mob/dead/observer))
var/mob/dead/observer/O = Player
if(!O.started_as_observer)
Player << "<font color='red'><b>You did not survive the events on [station_name()]...</b></font>"
else
Player << "<font color='red'><b>You did not survive the events on [station_name()]...</b></font>"
world << "<br>"
for (var/mob/living/silicon/ai/aiPlayer in mob_list)
@@ -427,7 +432,7 @@ var/global/datum/controller/gameticker/ticker
robo.laws.show_laws(world)
if(dronecount)
world << "<b>There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round."
world << "<b>There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round."
mode.declare_completion()//To declare normal completion.

View File

@@ -16,6 +16,7 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
required_players_secret = 25
required_enemies = 4
recommended_enemies = 6
votable = 0
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
@@ -106,6 +107,8 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
vox.languages = list() // Removing language from chargen.
vox.flavor_text = ""
vox.add_language("Vox-pidgin")
vox.add_language("Galactic Common")
vox.add_language("Tradeband")
vox.h_style = "Short Vox Quills"
vox.f_style = "Shaved"

View File

@@ -153,7 +153,7 @@
set name = "System Override"
set desc = "Start the victory timer"
if (!istype(ticker.mode,/datum/game_mode/malfunction))
usr << "You cannot begin a takeover in this round type!."
usr << "You cannot begin a takeover in this round type!"
return
if (ticker.mode:malf_mode_declared)
usr << "You've already begun your takeover."

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

@@ -51,7 +51,7 @@ datum/game_mode/mutiny
"leaks into a negative reality",
"antiparticle clouds",
"residual bluespace energy",
"suspected syndicate operatives",
"suspected criminal operatives",
"malfunctioning von Neumann probe swarms",
"shadowy interlopers",
"a stranded Vox arkship",

View File

@@ -310,7 +310,7 @@ datum
target = targeta
job = joba
weight = get_points(job)
explanation_text = "[target.current.real_name], the [target.assigned_role] is a [pick("relative of a","friend of a","") + pick("high ranking","important","well-liked")] Syndicate [pick("Leader","Officer","Agent","sympathiser")]. Make sure they get off the station safely, while minimizing intervention."
explanation_text = "[target.current.real_name], the [target.assigned_role] is a [pick("relative of a","friend of a","") + pick("high ranking","important","well-liked")] mercenary [pick("Leader","Officer","Agent","sympathiser")]. Make sure they get off the station safely, while minimizing intervention."
check_completion()
if(!emergency_shuttle.returned())

View File

@@ -1,5 +1,5 @@
/*
NUCLEAR EMERGENCY ROUNDTYPE
MERCENARY ROUNDTYPE
*/
var/global/list/turf/synd_spawn = list()
@@ -10,7 +10,7 @@ var/global/list/turf/synd_spawn = list()
/datum/game_mode/nuclear
name = "nuclear emergency"
name = "mercenary"
config_tag = "nuclear"
required_players = 15
required_players_secret = 25 // 25 players - 5 players to be the nuke ops = 20 players remaining
@@ -30,9 +30,8 @@ var/global/list/turf/synd_spawn = list()
/datum/game_mode/nuclear/announce()
world << "<B>The current game mode is - Nuclear Emergency!</B>"
world << "<B>The current game mode is - Mercenary!</B>"
world << "<B>A [syndicate_name()] Strike Force is approaching [station_name()]!</B>"
world << "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear auth. disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! Also, most likely Syndicate star ships are in the vicinity so take care not to lose the disk!\n<B>Syndicate</B>: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\n<B>Personnel</B>: Hold the disk and <B>escape with the disk</B> on the shuttle!"
/datum/game_mode/nuclear/can_start()//This could be better, will likely have to recode it later
if(!..())
@@ -69,7 +68,7 @@ var/global/list/turf/synd_spawn = list()
for(var/datum/mind/synd_mind in syndicates)
synd_mind.assigned_role = "MODE" //So they aren't chosen for other jobs.
synd_mind.special_role = "Syndicate"//So they actually have a special role/N
synd_mind.special_role = "Mercenary"//So they actually have a special role/N
return 1
@@ -168,7 +167,7 @@ var/global/list/turf/synd_spawn = list()
/datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code)
var/obj/effect/landmark/code_spawn = locate("landmark*Nuclear-Code")
if (nuke_code)
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
synd_mind.store_memory("<B>Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
synd_mind.current << "The nuclear authorization code is: <B>[nuke_code]</B>"
synd_mind.current << "To speak on the strike team's private channel use :t"
var/obj/item/weapon/paper/P = new
@@ -198,7 +197,7 @@ var/global/list/turf/synd_spawn = list()
/datum/game_mode/proc/greet_syndicate(var/datum/mind/syndicate, var/you_are=1)
if (you_are)
syndicate.current << "\blue You are a [syndicate_name()] agent!"
syndicate.current << "\blue You are a [syndicate_name()] operative!"
show_objectives(syndicate)
/datum/game_mode/proc/random_radio_frequency()
@@ -232,8 +231,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")
@@ -280,9 +279,9 @@ var/global/list/turf/synd_spawn = list()
//derp //Used for tracking if the syndies actually haul the nuke to the station //no
//herp //Used for tracking if the syndies got the shuttle off of the z-level //NO, DON'T FUCKING NAME VARS LIKE THIS
if (!disk_rescued && station_was_nuked && !syndies_didnt_escape)
if(!disk_rescued && station_was_nuked && !syndies_didnt_escape)
feedback_set_details("round_end_result","win - syndicate nuke")
world << "<FONT size = 3><B>Syndicate Major Victory!</B></FONT>"
world << "<FONT size = 3><B>Mercenary Major Victory!</B></FONT>"
world << "<B>[syndicate_name()] operatives have destroyed [station_name()]!</B>"
else if (!disk_rescued && station_was_nuked && syndies_didnt_escape)
@@ -312,12 +311,12 @@ var/global/list/turf/synd_spawn = list()
else if (!disk_rescued && is_operatives_are_dead())
feedback_set_details("round_end_result","loss - evacuation - disk not secured")
world << "<FONT size = 3><B>Syndicate Minor Victory!</B></FONT>"
world << "<FONT size = 3><B>Mercenary Minor Victory!</B></FONT>"
world << "<B>The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!</B>"
else if (!disk_rescued && crew_evacuated)
feedback_set_details("round_end_result","halfwin - detonation averted")
world << "<FONT size = 3><B>Syndicate Minor Victory!</B></FONT>"
world << "<FONT size = 3><B>Mercenary Minor Victory!</B></FONT>"
world << "<B>[syndicate_name()] operatives recovered the abandoned authentication disk but detonation of [station_name()] was averted.</B> Next time, don't lose the disk!"
else if (!disk_rescued && !crew_evacuated)
@@ -331,7 +330,7 @@ var/global/list/turf/synd_spawn = list()
/datum/game_mode/proc/auto_declare_completion_nuclear()
if( syndicates.len || (ticker && istype(ticker.mode,/datum/game_mode/nuclear)) )
var/text = "<FONT size = 2><B>The syndicate operatives were:</B></FONT>"
var/text = "<FONT size = 2><B>The mercenaries were:</B></FONT>"
for(var/datum/mind/syndicate in syndicates)

View File

@@ -403,7 +403,7 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
off_station = 2
if(ticker)
if(ticker.mode && ticker.mode.name == "nuclear emergency")
if(ticker.mode && ticker.mode.name == "mercenary")
var/obj/machinery/computer/shuttle_control/multi/syndicate/syndie_location = locate(/obj/machinery/computer/shuttle_control/multi/syndicate)
if(syndie_location)
ticker.mode:syndies_didnt_escape = (syndie_location.z > 1 ? 0 : 1) //muskets will make me change this, but it will do for now
@@ -411,7 +411,7 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
ticker.station_explosion_cinematic(off_station,null)
if(ticker.mode)
ticker.mode.explosion_in_progress = 0
if(ticker.mode.name == "nuclear emergency")
if(ticker.mode.name == "mercenary")
ticker.mode:nukes_left --
else
world << "<B>The station was destoyed by the nuclear blast!</B>"

View File

@@ -150,7 +150,7 @@
)
var/where = mob.equip_in_one_of_slots(T, slots)
if (!where)
mob << "The Syndicate were unfortunately unable to get you a flash."
mob << "Your employers were unfortunately unable to get you a flash."
else
mob << "The flash in your [where] will help you to persuade the crew to join your cause."
mob.update_icons()

View File

@@ -19,16 +19,12 @@
var/all_brigged = 0
var/brigged_time = 0
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
/datum/game_mode/rp_revolution/announce()
world << "<B>The current game mode is - Revolution RP!</B>"
/datum/game_mode/rp_revolution/send_intercept()
var/intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested staus information:</FONT><HR>"
intercepttext += "<B> Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:</B>"
intercepttext += "<B> Cent. Com has recently been contacted by the following subervsive or criminal-affiliated organisations in your area, please investigate any information you may have:</B>"
var/list/possible_modes = list()
possible_modes.Add("revolution", "wizard", "traitor", "malf")
@@ -95,7 +91,7 @@
/datum/game_mode/rp_revolution/send_intercept()
var/intercepttext = "<FONT size = 3><B>Cent. Com. Update</B> Requested staus information:</FONT><HR>"
intercepttext += "<B> Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:</B>"
intercepttext += "<B> Cent. Com has recently been contacted by the following subversive or criminal-affiliated organisations in your area, please investigate any information you may have:</B>"
var/list/possible_modes = list()
possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf")

View File

@@ -3,9 +3,6 @@
config_tag = "sandbox"
required_players = 0
uplink_welcome = "Syndicate Uplink Console:"
uplink_uses = 10
/datum/game_mode/sandbox/announce()
world << "<B>The current game mode is - Sandbox!</B>"
world << "<B>Build your own station with the sandbox-panel command!</B>"

View File

@@ -24,7 +24,7 @@
/datum/game_mode/traitor/announce()
world << "<B>The current game mode is - Traitor!</B>"
world << "<B>There is a syndicate traitor on the station. Do not let the traitor succeed!</B>"
world << "<B>There is a foreign agent or traitor on the station. Do not let the traitor succeed!</B>"
/datum/game_mode/traitor/pre_setup()
@@ -151,7 +151,7 @@
return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder.
/datum/game_mode/proc/give_codewords(mob/living/traitor_mob)
traitor_mob << "<u><b>The Syndicate provided you with the following information on how to identify their agents:</b></u>"
traitor_mob << "<u><b>Your employers provided you with the following information on how to identify possible allies:</b></u>"
traitor_mob << "<b>Code Phrase</b>: <span class='danger'>[syndicate_code_phrase]</span>"
traitor_mob << "<b>Code Response</b>: <span class='danger'>[syndicate_code_response]</span>"
traitor_mob.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")

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

@@ -190,7 +190,7 @@
if("revolution")
if((H.mind in ticker.mode:revolutionaries) || (H.mind in ticker.mode:head_revolutionaries))
ticker.mode.update_all_rev_icons() //So the icon actually appears
if("nuclear emergency")
if("mercenary")
if(H.mind in ticker.mode.syndicates)
ticker.mode.update_all_synd_icons()
if("cult")

View File

@@ -472,7 +472,7 @@ var/global/list/holodeck_programs = list(
/obj/structure/holohoop
name = "basketball hoop"
desc = "Boom, Shakalaka!."
desc = "Boom, Shakalaka!"
icon = 'icons/obj/basketball.dmi'
icon_state = "hoop"
anchored = 1

View File

@@ -11,24 +11,24 @@
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()
return scan ? check_access(scan) : 0
/obj/machinery/computer/card/proc/is_authenticated()
return scan ? check_access(scan) : 0
proc/get_target_rank()
return modify && modify.assignment ? modify.assignment : "Unassigned"
/obj/machinery/computer/card/proc/get_target_rank()
return modify && modify.assignment ? modify.assignment : "Unassigned"
proc/format_jobs(list/jobs)
var/list/formatted = list()
for(var/job in jobs)
formatted.Add(list(list(
"display_name" = replacetext(job, " ", "&nbsp"),
"target_rank" = get_target_rank(),
"job" = job)))
/obj/machinery/computer/card/proc/format_jobs(list/jobs)
var/list/formatted = list()
for(var/job in jobs)
formatted.Add(list(list(
"display_name" = replacetext(job, " ", "&nbsp"),
"target_rank" = get_target_rank(),
"job" = job)))
return formatted
return formatted
/obj/machinery/computer/card/verb/eject_id()
set category = "Object"
@@ -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

@@ -209,7 +209,7 @@
return
Syndicate_announce(input, usr)
usr << "\blue Message transmitted."
log_say("[key_name(usr)] has made a Syndicate announcement: [input]")
log_say("[key_name(usr)] has made an illegal announcement: [input]")
centcomm_message_cooldown = 1
spawn(300)//10 minute cooldown
centcomm_message_cooldown = 0

View File

@@ -206,7 +206,7 @@
/obj/machinery/computer/pod/old/syndicate
name = "ProComp Executive IIc"
desc = "The Syndicate operate on a tight budget. Operates external airlocks."
desc = "Criminals often operate on a tight budget. Operates external airlocks."
title = "External Airlock Controls"
req_access = list(access_syndicate)

View File

@@ -10,7 +10,7 @@
var/use = 5
var/unlocked = 0
var/open = 0
var/brightness_on = 999 //can't remember what the maxed out value is
var/brightness_on = 8 //can't remember what the maxed out value is
/obj/machinery/floodlight/New()
src.cell = new(src)

View File

@@ -204,86 +204,6 @@
if("time")
mode = STATUS_DISPLAY_TIME
/obj/machinery/ai_status_display
icon = 'icons/obj/status_display.dmi'
icon_state = "frame"
name = "AI display"
anchored = 1
density = 0
var/mode = 0 // 0 = Blank
// 1 = AI emoticon
// 2 = Blue screen of death
var/picture_state // icon_state of ai picture
var/emotion = "Neutral"
/obj/machinery/ai_status_display/process()
if(stat & NOPOWER)
overlays.Cut()
return
update()
/obj/machinery/ai_status_display/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
return
set_picture("ai_bsod")
..(severity)
/obj/machinery/ai_status_display/proc/update()
if(mode==0) //Blank
overlays.Cut()
return
if(mode==1) // AI emoticon
switch(emotion)
if("Very Happy")
set_picture("ai_veryhappy")
if("Happy")
set_picture("ai_happy")
if("Neutral")
set_picture("ai_neutral")
if("Unsure")
set_picture("ai_unsure")
if("Confused")
set_picture("ai_confused")
if("Sad")
set_picture("ai_sad")
if("Surprised")
set_picture("ai_surprised")
if("Upset")
set_picture("ai_upset")
if("Angry")
set_picture("ai_angry")
if("BSOD")
set_picture("ai_bsod")
if("Blank")
set_picture("ai_off")
if("Problems?")
set_picture("ai_trollface")
if("Awesome")
set_picture("ai_awesome")
if("Dorfy")
set_picture("ai_urist")
if("Facepalm")
set_picture("ai_facepalm")
if("Friend Computer")
set_picture("ai_friend")
return
if(mode==2) // BSOD
set_picture("ai_bsod")
return
/obj/machinery/ai_status_display/proc/set_picture(var/state)
picture_state = state
if(overlays.len)
overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
#undef CHARS_PER_LINE
#undef FOND_SIZE

View File

@@ -0,0 +1,93 @@
/datum/ai_emotion
var/overlay
var/ckey
/datum/ai_emotion/New(var/over, var/key)
overlay = over
ckey = key
var/list/ai_status_emotions = list(
"Very Happy" = new /datum/ai_emotion("ai_veryhappy"),
"Happy" = new /datum/ai_emotion("ai_happy"),
"Neutral" = new /datum/ai_emotion("ai_neutral"),
"Unsure" = new /datum/ai_emotion("ai_unsure"),
"Confused" = new /datum/ai_emotion("ai_confused"),
"Sad" = new /datum/ai_emotion("ai_sad"),
"Surprised" = new /datum/ai_emotion("ai_surprised"),
"Upset" = new /datum/ai_emotion("ai_upset"),
"Angry" = new /datum/ai_emotion("ai_angry"),
"BSOD" = new /datum/ai_emotion("ai_bsod"),
"Blank" = new /datum/ai_emotion("ai_off"),
"Problems?" = new /datum/ai_emotion("ai_trollface"),
"Awesome" = new /datum/ai_emotion("ai_awesome"),
"Dorfy" = new /datum/ai_emotion("ai_urist"),
"Facepalm" = new /datum/ai_emotion("ai_facepalm"),
"Friend Computer" = new /datum/ai_emotion("ai_friend"),
"Tribunal" = new /datum/ai_emotion("ai_tribunal", "serithi"),
"Tribunal Malfunctioning" = new /datum/ai_emotion("ai_tribunal_malf", "serithi")
)
/proc/get_ai_emotions(var/ckey)
var/list/emotions = new
for(var/emotion_name in ai_status_emotions)
var/datum/ai_emotion/emotion = ai_status_emotions[emotion_name]
if(!emotion.ckey || emotion.ckey == ckey)
emotions += emotion_name
return emotions
/proc/set_ai_status_displays(mob/user as mob)
var/list/ai_emotions = get_ai_emotions(user.ckey)
var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions
for (var/obj/machinery/M in machines) //change status
if(istype(M, /obj/machinery/ai_status_display))
var/obj/machinery/ai_status_display/AISD = M
AISD.emotion = emote
//if Friend Computer, change ALL displays
else if(istype(M, /obj/machinery/status_display))
var/obj/machinery/status_display/SD = M
if(emote=="Friend Computer")
SD.friendc = 1
else
SD.friendc = 0
/obj/machinery/ai_status_display
icon = 'icons/obj/status_display.dmi'
icon_state = "frame"
name = "AI display"
anchored = 1
density = 0
var/mode = 0 // 0 = Blank
// 1 = AI emoticon
// 2 = Blue screen of death
var/picture_state // icon_state of ai picture
var/emotion = "Neutral"
/obj/machinery/ai_status_display/attack_ai/(mob/user as mob)
var/list/ai_emotions = get_ai_emotions(user.ckey)
var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions
src.emotion = emote
/obj/machinery/ai_status_display/proc/update()
if(mode==0) //Blank
overlays.Cut()
return
if(mode==1) // AI emoticon
var/datum/ai_emotion/ai_emotion = ai_status_emotions[emotion]
set_picture(ai_emotion.overlay)
return
if(mode==2) // BSOD
set_picture("ai_bsod")
return
/obj/machinery/ai_status_display/proc/set_picture(var/state)
picture_state = state
if(overlays.len)
overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)

View File

@@ -595,7 +595,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
@@ -623,35 +623,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)
var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P = passengers[pname]
var/mob/occupant = P.occupant
if (!pname)
return
visible_message("\red [user] opens the hatch on \the [P] and removes [occupant]!")
P.go_out()
P.log_message("[occupant] was removed.")
occupant_message("\red [occupant] was removed from \the [P] by [user]!")
var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P = passengers[pname]
var/mob/occupant = P.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.")
return
if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card"))
if(!in_range(src, usr)) return

View File

@@ -109,6 +109,17 @@
O.show_message("\red [usr] destroys the [name]!", 1)
health = 0
else
// Aliens can get straight through these.
if(istype(usr,/mob/living/carbon))
var/mob/living/carbon/M = usr
if(locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs)
for(var/mob/O in oviewers(src))
O.show_message("\red [usr] strokes the [name] and it melts away!", 1)
health = 0
healthcheck()
return
usr << "\blue You claw at the [name]."
for(var/mob/O in oviewers(src))
O.show_message("\red [usr] claws at the [name]!", 1)

View File

@@ -1,8 +0,0 @@
/obj/effect/sign/double/barsign
icon = 'icons/obj/barsigns.dmi'
icon_state = "empty"
anchored = 1
New()
var/list/valid_states = list("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead", "whiskeyimplant", "carpecarp", "robustroadhouse", "greytide", "theredshirt")
src.icon_state = "[pick(valid_states)]"

View File

@@ -20,7 +20,7 @@
icon_state="poster4"
/datum/poster/tg_5
name = "Syndicate Recruitment Poster"
name = "Mercenary Recruitment Poster"
desc = "See the galaxy! Shatter corrupt megacorporations! Join today!"
icon_state="poster5"

View File

@@ -11,14 +11,13 @@ would spawn and follow the beaker, even if it is carried or thrown.
icon = 'icons/effects/effects.dmi'
mouse_opacity = 0
unacidable = 1//So effect are not targeted by alien acid.
flags = TABLEPASS
pass_flags = PASSTABLE | PASSGRILLE
/obj/effect/effect/water
name = "water"
icon = 'icons/effects/effects.dmi'
icon_state = "extinguish"
var/life = 15.0
flags = TABLEPASS
mouse_opacity = 0
/obj/effect/proc/delete()

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.
*/
@@ -260,6 +260,12 @@
if(ishuman(M))
//START HUMAN
var/mob/living/carbon/human/H = M
var/list/mob_equip = list()
if(H.species.hud && H.species.hud.equip_slots)
mob_equip = H.species.hud.equip_slots
if(H.species && !(slot in mob_equip))
return 0
switch(slot)
if(slot_l_hand)
@@ -303,7 +309,7 @@
if(slot_belt)
if(H.belt)
return 0
if(!H.w_uniform)
if(!H.w_uniform && (slot_w_uniform in mob_equip))
if(!disable_warning)
H << "\red You need a jumpsuit before you can attach this [name]."
return 0
@@ -351,7 +357,7 @@
if(slot_wear_id)
if(H.wear_id)
return 0
if(!H.w_uniform)
if(!H.w_uniform && (slot_w_uniform in mob_equip))
if(!disable_warning)
H << "\red You need a jumpsuit before you can attach this [name]."
return 0
@@ -361,7 +367,7 @@
if(slot_l_store)
if(H.l_store)
return 0
if(!H.w_uniform)
if(!H.w_uniform && (slot_w_uniform in mob_equip))
if(!disable_warning)
H << "\red You need a jumpsuit before you can attach this [name]."
return 0
@@ -372,7 +378,7 @@
if(slot_r_store)
if(H.r_store)
return 0
if(!H.w_uniform)
if(!H.w_uniform && (slot_w_uniform in mob_equip))
if(!disable_warning)
H << "\red You need a jumpsuit before you can attach this [name]."
return 0
@@ -384,7 +390,7 @@
if(slot_s_store)
if(H.s_store)
return 0
if(!H.wear_suit)
if(!H.wear_suit && (slot_wear_suit in mob_equip))
if(!disable_warning)
H << "\red You need a suit before you can attach this [name]."
return 0
@@ -678,7 +684,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
usr.client.pixel_x = -viewoffset
usr.client.pixel_y = 0
usr.visible_message("[usr] peers through the [devicename].")
usr.visible_message("[usr] peers through the [zoomdevicename ? "[zoomdevicename] of the [src.name]" : "[src.name]"].")
/*
if(istype(usr,/mob/living/carbon/human/))
@@ -698,6 +704,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
usr.client.pixel_y = 0
if(!cannotzoom)
usr.visible_message("[usr] lowers the [devicename].")
usr.visible_message("[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].")
return

View File

@@ -35,6 +35,8 @@
icon_state = "bodybag_closed"
icon_closed = "bodybag_closed"
icon_opened = "bodybag_open"
open_sound = 'sound/items/zip.ogg'
close_sound = 'sound/items/zip.ogg'
var/item_path = /obj/item/bodybag
density = 0
storage_capacity = (mob_size * 2) - 1
@@ -106,8 +108,6 @@
desc = "A non-reusable plastic bag designed to prevent additional damage to an occupant at the cost of genetic damage."
icon = 'icons/obj/cryobag.dmi'
item_path = /obj/item/bodybag/cryobag
open_sound = 'sound/items/zip.ogg'
close_sound = 'sound/items/zip.ogg'
store_misc = 0
store_items = 0
var/used = 0

View File

@@ -225,7 +225,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if (!c) // if the user hasn't selected a PDA file we can't send a message
return
var/selected = plist[c]
create_message(usr, selected)
create_message(usr, selected, 0)
/obj/item/device/pda/ai/verb/cmd_toggle_pda_receiver()
@@ -260,9 +260,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/HTML = "<html><head><title>AI PDA Message Log</title></head><body>"
for(var/index in tnote)
if(index["sent"])
HTML += addtext("<i><b>&rarr; To <a href='byond://?src=\ref[src];choice=Message;target=",index["src"],"'>", index["owner"],"</a>:</b></i><br>", index["message"], "<br>")
HTML += addtext("<i><b>&rarr; To <a href='byond://?src=\ref[src];choice=Message;notap;target=",index["src"],"'>", index["owner"],"</a>:</b></i><br>", index["message"], "<br>")
else
HTML += addtext("<i><b>&larr; From <a href='byond://?src=\ref[src];choice=Message;target=",index["target"],"'>", index["owner"],"</a>:</b></i><br>", index["message"], "<br>")
HTML += addtext("<i><b>&larr; From <a href='byond://?src=\ref[src];choice=Message;notap;target=",index["target"],"'>", index["owner"],"</a>:</b></i><br>", index["message"], "<br>")
HTML +="</body></html>"
usr << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
@@ -656,7 +656,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if("Message")
var/obj/item/device/pda/P = locate(href_list["target"])
src.create_message(U, P)
src.create_message(U, P, !("notap" in href_list))
if(mode == 2)
if(href_list["target"] in conversations) // Need to make sure the message went through, if not welp.
active_conversation = href_list["target"]
@@ -879,11 +879,11 @@ var/global/list/obj/item/device/pda/PDAs = list()
id.loc = get_turf(src)
id = null
/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P)
U.visible_message("<span class='notice'>[U] taps on \his PDA's screen.</span>")
/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1)
if(tap)
U.visible_message("<span class='notice'>[U] taps on \his PDA's screen.</span>")
U.last_target_click = world.time
var/t = input(U, "Please enter message", name, null) as text
var/t = input(U, "Please enter message", P.name, null) as text
t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
if (!t || !istype(P))
return

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

@@ -5,6 +5,7 @@
icon = 'icons/obj/radio.dmi'
icon_state = "cypherkey"
item_state = ""
w_class = 1
var/translate_binary = 0
var/translate_hive = 0
var/syndie = 0
@@ -17,7 +18,7 @@
/obj/item/device/encryptionkey/syndicate
icon_state = "cypherkey"
channels = list("Syndicate" = 1)
channels = list("Mercenary" = 1)
origin_tech = "syndicate=3"
syndie = 1//Signifies that it de-crypts Syndicate transmissions

View File

@@ -19,6 +19,18 @@
keyslot1 = new /obj/item/device/encryptionkey/
recalculateChannels()
/obj/item/device/radio/headset/handle_message_mode(mob/living/M as mob, message, channel)
if (channel == "special")
if (translate_binary)
var/datum/language/binary = all_languages["Robot Talk"]
binary.broadcast(M, message)
if (translate_hive)
var/datum/language/hivemind = all_languages["Hivemind"]
hivemind.broadcast(M, message)
return null
return ..()
/obj/item/device/radio/headset/receive_range(freq, level, aiOverride = 0)
if (aiOverride)
return ..(freq, level)

View File

@@ -1,6 +1,3 @@
var/GLOBAL_RADIO_TYPE = 1 // radio type to use
// 0 = old radios
// 1 = new radios (subspace technology)
/obj/item/device/radio
@@ -219,6 +216,23 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
del(A)
return
// Interprets the message mode when talking into a radio, possibly returning a connection datum
/obj/item/device/radio/proc/handle_message_mode(mob/living/M as mob, message, message_mode)
// If a channel isn't specified, send to common.
if(!message_mode || message_mode == "headset")
return radio_connection
// Otherwise, if a channel is specified, look for it.
if(channels)
if (message_mode == "department") // Department radio shortcut
message_mode = channels[1]
if (channels[message_mode]) // only broadcast if the channel is set on
return secure_radio_connections[message_mode]
// If we were to send to a channel we don't have, drop it.
return null
/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, var/verb = "says", var/datum/language/speaking = null)
if(!on) return // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
@@ -231,161 +245,85 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
M.last_target_click = world.time
if(GLOBAL_RADIO_TYPE == 1) // NEW RADIO SYSTEMS: By Doohl
/* Quick introduction:
This new radio system uses a very robust FTL signaling technology unoriginally
dubbed "subspace" which is somewhat similar to 'blue-space' but can't
actually transmit large mass. Headsets are the only radio devices capable
of sending subspace transmissions to the Communications Satellite.
/* Quick introduction:
This new radio system uses a very robust FTL signaling technology unoriginally
dubbed "subspace" which is somewhat similar to 'blue-space' but can't
actually transmit large mass. Headsets are the only radio devices capable
of sending subspace transmissions to the Communications Satellite.
A headset sends a signal to a subspace listener/reciever elsewhere in space,
the signal gets processed and logged, and an audible transmission gets sent
to each individual headset.
*/
A headset sends a signal to a subspace listener/reciever elsewhere in space,
the signal gets processed and logged, and an audible transmission gets sent
to each individual headset.
*/
//#### Grab the connection datum ####//
var/datum/radio_frequency/connection = handle_message_mode(M, message, channel)
if (!istype(connection))
return
if (!connection)
return
//#### Grab the connection datum ####//
var/datum/radio_frequency/connection = null
if(channel == "headset")
channel = null
if(channel) // If a channel is specified, look for it.
if(channels && channels.len > 0)
if (channel == "department")
//world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\""
channel = channels[1]
connection = secure_radio_connections[channel]
if (!channels[channel]) // if the channel is turned off, don't broadcast
return
else
// If we were to send to a channel we don't have, drop it.
else // If a channel isn't specified, send to common.
connection = radio_connection
channel = null
if (!istype(connection))
return
if (!connection)
return
var/turf/position = get_turf(src)
var/turf/position = get_turf(src)
//#### Tagging the signal with all appropriate identity values ####//
//#### Tagging the signal with all appropriate identity values ####//
// ||-- The mob's name identity --||
var/displayname = M.name // grab the display name (name you get when you hover over someone's icon)
var/real_name = M.real_name // mob's real name
var/mobkey = "none" // player key associated with mob
var/voicemask = 0 // the speaker is wearing a voice mask
if(M.client)
mobkey = M.key // assign the mob's key
// ||-- The mob's name identity --||
var/displayname = M.name // grab the display name (name you get when you hover over someone's icon)
var/real_name = M.real_name // mob's real name
var/mobkey = "none" // player key associated with mob
var/voicemask = 0 // the speaker is wearing a voice mask
if(M.client)
mobkey = M.key // assign the mob's key
var/jobname // the mob's "job"
var/jobname // the mob's "job"
// --- Human: use their actual job ---
if (ishuman(M))
jobname = M:get_assignment()
// --- Human: use their actual job ---
if (ishuman(M))
jobname = M:get_assignment()
// --- Carbon Nonhuman ---
else if (iscarbon(M)) // Nonhuman carbon mob
jobname = "No id"
// --- Carbon Nonhuman ---
else if (iscarbon(M)) // Nonhuman carbon mob
jobname = "No id"
// --- AI ---
else if (isAI(M))
jobname = "AI"
// --- AI ---
else if (isAI(M))
jobname = "AI"
// --- Cyborg ---
else if (isrobot(M))
jobname = "Cyborg"
// --- Cyborg ---
else if (isrobot(M))
jobname = "Cyborg"
// --- Personal AI (pAI) ---
else if (istype(M, /mob/living/silicon/pai))
jobname = "Personal AI"
// --- Personal AI (pAI) ---
else if (istype(M, /mob/living/silicon/pai))
jobname = "Personal AI"
// --- Unidentifiable mob ---
else
jobname = "Unknown"
// --- Unidentifiable mob ---
else
jobname = "Unknown"
// --- Modifications to the mob's identity ---
// --- Modifications to the mob's identity ---
// The mob is disguising their identity:
if (ishuman(M) && M.GetVoice() != real_name)
displayname = M.GetVoice()
jobname = "Unknown"
voicemask = 1
// The mob is disguising their identity:
if (ishuman(M) && M.GetVoice() != real_name)
displayname = M.GetVoice()
jobname = "Unknown"
voicemask = 1
/* ###### Radio headsets can only broadcast through subspace ###### */
if(subspace_transmission)
// First, we want to generate a new radio signal
var/datum/signal/signal = new
signal.transmission_method = 2 // 2 would be a subspace transmission.
// transmission_method could probably be enumerated through #define. Would be neater.
// --- Finally, tag the actual signal with the appropriate values ---
signal.data = list(
// Identity-associated tags:
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
"key" = mobkey, // the mob's key
"vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mask
// We store things that would otherwise be kept in the actual mob
// so that they can be logged even AFTER the mob is deleted or something
// Other tags:
"compression" = rand(45,50), // compressed radio signal
"message" = message, // the actual sent message
"connection" = connection, // the radio connection to use
"radio" = src, // stores the radio used for transmission
"slow" = 0, // how much to sleep() before broadcasting - simulates net lag
"traffic" = 0, // dictates the total traffic sum that the signal went through
"type" = 0, // determines what type of radio input it is: normal broadcast
"server" = null, // the last server to log this signal
"reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
"level" = position.z, // The source's z level
"language" = speaking,
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
// Allinone can act as receivers.
for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
R.receive_signal(signal)
// Receiving code can be located in Telecommunications.dm
return
/* ###### Intercoms and station-bounced radios ###### */
var/filter_type = 2
/* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */
if(istype(src, /obj/item/device/radio/intercom))
filter_type = 1
/* ###### Radio headsets can only broadcast through subspace ###### */
if(subspace_transmission)
// First, we want to generate a new radio signal
var/datum/signal/signal = new
signal.transmission_method = 2
/* --- Try to send a normal subspace broadcast first */
signal.transmission_method = 2 // 2 would be a subspace transmission.
// transmission_method could probably be enumerated through #define. Would be neater.
// --- Finally, tag the actual signal with the appropriate values ---
signal.data = list(
// Identity-associated tags:
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"realname" = real_name, // the mob's real name
@@ -394,192 +332,102 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
"key" = mobkey, // the mob's key
"vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mas
"vmask" = voicemask, // 1 if the mob is using a voice gas mask
"compression" = 0, // uncompressed radio signal
// We store things that would otherwise be kept in the actual mob
// so that they can be logged even AFTER the mob is deleted or something
// Other tags:
"compression" = rand(45,50), // compressed radio signal
"message" = message, // the actual sent message
"connection" = connection, // the radio connection to use
"radio" = src, // stores the radio used for transmission
"slow" = 0,
"traffic" = 0,
"type" = 0,
"server" = null,
"reject" = 0,
"level" = position.z,
"slow" = 0, // how much to sleep() before broadcasting - simulates net lag
"traffic" = 0, // dictates the total traffic sum that the signal went through
"type" = 0, // determines what type of radio input it is: normal broadcast
"server" = null, // the last server to log this signal
"reject" = 0, // if nonzero, the signal will not be accepted by any broadcasting machinery
"level" = position.z, // The source's z level
"language" = speaking,
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
//#### Sending the signal to all subspace receivers ####//
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
// Allinone can act as receivers.
for(var/obj/machinery/telecomms/allinone/R in telecomms_list)
R.receive_signal(signal)
sleep(rand(10,25)) // wait a little...
if(signal.data["done"] && position.z in signal.data["level"])
// we're done here.
return
// Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
// Send a mundane broadcast with limited targets:
//THIS IS TEMPORARY.
if(!connection) return //~Carn
Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message, displayname, jobname, real_name, M.voice_name,
filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking)
// Receiving code can be located in Telecommunications.dm
return
/* ###### Intercoms and station-bounced radios ###### */
else // OLD RADIO SYSTEMS: By Goons?
var/filter_type = 2
var/datum/radio_frequency/connection = null
if(channel && channels && channels.len > 0)
if (channel == "department")
//world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\""
channel = channels[1]
connection = secure_radio_connections[channel]
else
connection = radio_connection
channel = null
if (!istype(connection))
return
var/display_freq = connection.frequency
/* --- Intercoms can only broadcast to other intercoms, but bounced radios can broadcast to bounced radios and intercoms --- */
if(istype(src, /obj/item/device/radio/intercom))
filter_type = 1
//world << "DEBUG: used channel=\"[channel]\" frequency= \"[display_freq]\" connection.devices.len = [connection.devices.len]"
var/eqjobname
var/datum/signal/signal = new
signal.transmission_method = 2
if (ishuman(M))
eqjobname = M:get_assignment()
else if (iscarbon(M))
eqjobname = "No id" //only humans can wear ID
else if (isAI(M))
eqjobname = "AI"
else if (isrobot(M))
eqjobname = "Cyborg"//Androids don't really describe these too well, in my opinion.
else if (istype(M, /mob/living/silicon/pai))
eqjobname = "Personal AI"
else
eqjobname = "Unknown"
if (!(wires & WIRE_TRANSMIT))
return
/* --- Try to send a normal subspace broadcast first */
var/list/receive = list()
signal.data = list(
//for (var/obj/item/device/radio/R in radio_connection.devices)
for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"]) // Modified for security headset code -- TLE
//if(R.accept_rad(src, message))
receive |= R.send_hear(display_freq, 0)
"mob" = M, // store a reference to the mob
"mobtype" = M.type, // the mob's type
"realname" = real_name, // the mob's real name
"name" = displayname, // the mob's display name
"job" = jobname, // the mob's job
"key" = mobkey, // the mob's key
"vmessage" = pick(M.speak_emote), // the message to display if the voice wasn't understood
"vname" = M.voice_name, // the name to display if the voice wasn't understood
"vmask" = voicemask, // 1 if the mob is using a voice gas mas
//world << "DEBUG: receive.len=[receive.len]"
var/list/heard_masked = list() // masked name or no real name
var/list/heard_normal = list() // normal message
var/list/heard_voice = list() // voice message
var/list/heard_garbled = list() // garbled message
"compression" = 0, // uncompressed radio signal
"message" = message, // the actual sent message
"connection" = connection, // the radio connection to use
"radio" = src, // stores the radio used for transmission
"slow" = 0,
"traffic" = 0,
"type" = 0,
"server" = null,
"reject" = 0,
"level" = position.z,
"language" = speaking,
"verb" = verb
)
signal.frequency = connection.frequency // Quick frequency set
for (var/mob/R in receive)
if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
if (R.say_understands(M))
if (ishuman(M) && M.GetVoice() != M.real_name)
heard_masked += R
else
heard_normal += R
else
heard_voice += R
for(var/obj/machinery/telecomms/receiver/R in telecomms_list)
R.receive_signal(signal)
if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled))
var/part_a = "<span class='radio'><span class='name'>"
//var/part_b = "</span><b> \icon[src]\[[format_frequency(frequency)]\]</b> <span class='message'>"
var/freq_text= get_frequency_name(display_freq)
var/part_b = "</span><b> \icon[src]\[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/part_c = "</span></span>"
sleep(rand(10,25)) // wait a little...
if (display_freq in ANTAG_FREQS)
part_a = "<span class='syndradio'><span class='name'>"
else if (display_freq==COMM_FREQ)
part_a = "<span class='comradio'><span class='name'>"
else if (display_freq in DEPT_FREQS)
part_a = "<span class='deptradio'><span class='name'>"
if(signal.data["done"] && position.z in signal.data["level"])
// we're done here.
return
var/quotedmsg = M.say_quote(message)
// Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level.
// Send a mundane broadcast with limited targets:
//This following recording is intended for research and feedback in the use of department radio channels.
//THIS IS TEMPORARY. YEAH RIGHT
if(!connection) return //~Carn
var/part_blackbox_b = "</span><b> \[[freq_text]\]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/blackbox_msg = "[part_a][M.name][part_blackbox_b][quotedmsg][part_c]"
//var/blackbox_admin_msg = "[part_a][M.name] (Real name: [M.real_name])[part_blackbox_b][quotedmsg][part_c]"
if(istype(blackbox))
//BR.messages_admin += blackbox_admin_msg
switch(display_freq)
if(PUB_FREQ)
blackbox.msg_common += blackbox_msg
if(SCI_FREQ)
blackbox.msg_science += blackbox_msg
if(COMM_FREQ)
blackbox.msg_command += blackbox_msg
if(MED_FREQ)
blackbox.msg_medical += blackbox_msg
if(ENG_FREQ)
blackbox.msg_engineering += blackbox_msg
if(SEC_FREQ)
blackbox.msg_security += blackbox_msg
if(DTH_FREQ)
blackbox.msg_deathsquad += blackbox_msg
if(SYND_FREQ)
blackbox.msg_syndicate += blackbox_msg
if(SUP_FREQ)
blackbox.msg_cargo += blackbox_msg
else
blackbox.messages += blackbox_msg
Broadcast_Message(connection, M, voicemask, pick(M.speak_emote),
src, message, displayname, jobname, real_name, M.voice_name,
filter_type, signal.data["compression"], list(position.z), connection.frequency,verb,speaking)
//End of research and feedback code.
if (length(heard_masked))
var/N = M.name
var/J = eqjobname
if(ishuman(M) && M.GetVoice() != M.real_name)
N = M.GetVoice()
J = "Unknown"
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_masked)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[N] ([J]) </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
if (length(heard_normal))
var/rendered = "[part_a][M.real_name][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_normal)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.real_name] ([eqjobname]) </a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
if (length(heard_voice))
var/rendered = "[part_a][M.voice_name][part_b][pick(M.speak_emote)][part_c]"
for (var/mob/R in heard_voice)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name] ([eqjobname]) </a>[part_b][pick(M.speak_emote)][part_c]", 2)
else
R.show_message(rendered, 2)
if (length(heard_garbled))
quotedmsg = M.say_quote(stars(message))
var/rendered = "[part_a][M.voice_name][part_b][quotedmsg][part_c]"
for (var/mob/R in heard_voice)
if(istype(R, /mob/living/silicon/ai))
R.show_message("[part_a]<a href='byond://?src=\ref[src];track2=\ref[R];track=\ref[M]'>[M.voice_name]</a>[part_b][quotedmsg][part_c]", 2)
else
R.show_message(rendered, 2)
/obj/item/device/radio/hear_talk(mob/M as mob, msg, var/verb = "says", var/datum/language/speaking = null)
@@ -689,6 +537,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
icon_state = "radio"
canhear_range = 3
/obj/item/device/radio/borg/talk_into()
..()
if (isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
var/datum/robot_component/C = R.components["radio"]
R.cell_use_power(C.active_usage)
/obj/item/device/radio/borg/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)

View File

@@ -160,7 +160,7 @@ datum/nano_item_lists
NANO UI FOR UPLINK WOOP WOOP
*/
/obj/item/device/uplink/hidden/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/title = "Syndicate Uplink"
var/title = "Remote Uplink"
var/data[0]
data["welcome"] = welcome

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

@@ -88,7 +88,7 @@
item_state = "balloon-empty"
/obj/item/toy/syndicateballoon
name = "syndicate balloon"
name = "criminal balloon"
desc = "There is a tag on the back that reads \"FUK NT!11!\"."
throwforce = 0
throw_speed = 4

View File

@@ -3,7 +3,7 @@
icon_state = "empty"
anchored = 1
New()
ChangeSign(pick("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead"))
ChangeSign(pick("pinkflamingo", "magmasea", "limbo", "rustyaxe", "armokbar", "brokendrum", "meadbay", "thedamnwall", "thecavern", "cindikate", "theorchard", "thesaucyclown", "theclownshead", "whiskeyimplant", "carpecarp", "robustroadhouse", "greytide", "theredshirt"))
return
proc/ChangeSign(var/Text)
src.icon_state = "[Text]"
@@ -15,7 +15,7 @@
if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/card = I
if(access_bar in card.GetAccess())
var/sign_type = input(user, "What would you like to change the barsign to?") as null|anything in list("Pink Flamingo", "Magma Sea", "Limbo", "Rusty Axe", "Armok Bar", "Broken Drum", "Mead Bay", "The Damn Wall", "The Cavern", "Cindi Kate", "The Orchard", "The Saucy Clown", "The Clowns Head")
var/sign_type = input(user, "What would you like to change the barsign to?") as null|anything in list("Off", "Pink Flamingo", "Magma Sea", "Limbo", "Rusty Axe", "Armok Bar", "Broken Drum", "Mead Bay", "The Damn Wall", "The Cavern", "Cindi Kate", "The Orchard", "The Saucy Clown", "The Clowns Head", "Whiskey Implant", "Carpe Carp", "Robust Roadhouse", "Greytide", "The Redshirt")
if(sign_type == null)
return
else

View File

@@ -1,7 +1,7 @@
//wip wip wup
/obj/structure/mirror
name = "mirror"
desc = "Mirror mirror on the wall, who's the most robust of them all?"
name = "SalonPro Nano-Mirror(TM)"
desc = "The leading technology in hair salon products, utilizing nano-machinery to style your hair just right."
icon = 'icons/obj/watercloset.dmi'
icon_state = "mirror"
density = 0

View File

@@ -78,7 +78,7 @@
/obj/item/weapon/stool/attack(mob/M as mob, mob/user as mob)
if (prob(5) && istype(M,/mob/living))
user.visible_message("\red [user] breaks [src] over [M]'s back!.")
user.visible_message("\red [user] breaks [src] over [M]'s back!")
user.u_equip(src)
var/obj/item/stack/sheet/metal/m = new/obj/item/stack/sheet/metal
m.loc = get_turf(src)

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

@@ -114,15 +114,15 @@
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
else if (istype(usr,/mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(H.species.can_shred(H))
attack_generic(H,25)
return
else if (usr.a_intent == "hurt")
if (istype(usr,/mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
if(H.species.can_shred(H))
attack_generic(H,25)
return
playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
usr.visible_message("\red [usr.name] bangs against the [src.name]!", \
"\red You bang against the [src.name]!", \

View File

@@ -12,6 +12,11 @@
/turf/simulated/floor/airless/ceiling
icon_state = "rockvault"
/turf/simulated/floor/airless/catwalk
icon = 'icons/turf/catwalks.dmi'
icon_state = "catwalk0"
name = "catwalk"
/turf/simulated/floor/light
name = "Light floor"
luminosity = 5

View File

@@ -75,7 +75,7 @@
// Okay, so let's make it so that people can travel z levels but not nuke disks!
// if(ticker.mode.name == "nuclear emergency") return
// if(ticker.mode.name == "mercenary") return
if(A.z > 6 && !config.use_overmap) return
if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1))
if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))

View File

@@ -1,22 +0,0 @@
/mob/living/silicon/ai/proc/ai_statuschange()
set category = "AI Commands"
set name = "AI status"
if(usr.stat == 2)
usr <<"You cannot change your emotional status because you are dead!"
return
var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Friend Computer", "Beer mug", "Dwarf", "Fishtank", "Plump Helmet")
if(src.ckey == "serithi")
ai_emotions.Add("Tribunal","Tribunal Malfunctioning")
var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions
for (var/obj/machinery/ai_status_display/AISD in world) //change status
spawn( 0 )
AISD.emotion = emote
for (var/obj/machinery/status_display/SD in world) //if Friend Computer, change ALL displays
if(emote=="Friend Computer")
spawn(0)
SD.friendc = 1
else
spawn(0)
SD.friendc = 0
return

View File

@@ -149,6 +149,7 @@ var/list/admin_verbs_debug = list(
/client/proc/restart_controller,
/client/proc/remake_distribution_map,
/client/proc/show_distribution_map,
/client/proc/show_plant_genes,
/client/proc/enable_debug_verbs,
/client/proc/callproc,
/client/proc/toggledebuglogs,

View File

@@ -411,14 +411,14 @@
dat += "<a href='?src=\ref[src];delay_round_end=1'>[ticker.delay_end ? "End Round Normally" : "Delay Round End"]</a><br>"
if(ticker.mode.syndicates.len)
dat += "<br><table cellspacing=5><tr><td><B>Syndicates</B></td><td></td></tr>"
dat += "<br><table cellspacing=5><tr><td><B>Mercenaries</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.syndicates)
var/mob/M = N.current
if(M)
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td></tr>"
else
dat += "<tr><td><i>Nuclear Operative not found!</i></td></tr>"
dat += "<tr><td><i>Mercenary not found!</i></td></tr>"
dat += "</table><br><table><tr><td><B>Nuclear Disk(s)</B></td></tr>"
for(var/obj/item/weapon/disk/nuclear/N in world)
dat += "<tr><td>[N.name], "

View File

@@ -582,9 +582,9 @@
//Nuke Operative
if(jobban_isbanned(M, "operative") || isbanned_dept)
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=operative;jobban4=\ref[M]'><font color=red>[replacetext("Nuke Operative", " ", "&nbsp")]</font></a></td>"
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=operative;jobban4=\ref[M]'><font color=red>[replacetext("Mercenary", " ", "&nbsp")]</font></a></td>"
else
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=operative;jobban4=\ref[M]'>[replacetext("Nuke Operative", " ", "&nbsp")]</a></td>"
jobs += "<td width='20%'><a href='?src=\ref[src];jobban3=operative;jobban4=\ref[M]'>[replacetext("Mercenary", " ", "&nbsp")]</a></td>"
//Revolutionary
if(jobban_isbanned(M, "revolutionary") || isbanned_dept)
@@ -1476,11 +1476,11 @@
usr << "The person you are trying to contact is not wearing a headset"
return
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from The Syndicate", "")
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from a shadowy figure...", "")
if(!input) return
src.owner << "You sent [input] to [H] via a secure channel."
log_admin("[src.owner] replied to [key_name(H)]'s Syndicate message with the message [input].")
log_admin("[src.owner] replied to [key_name(H)]'s illegal message with the message [input].")
H << "You hear something crackle in your headset for a moment before a voice speaks. \"Please stand by for a message from your benefactor. Message as follows, agent. <b>\"[input]\"</b> Message ends.\""
else if(href_list["CentcommFaxView"])

View File

@@ -11,8 +11,8 @@
var/override
switch(parameter)
if(1)
override = input(src,"mode = ?","Enter Parameter",null) as anything in list("nuclear emergency","no override")
override = input(src,"mode = ?","Enter Parameter",null) as anything in list("mercenary","no override")
if(0)
override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","nuclear emergency","AI malfunction","no override")
override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","mercenary","AI malfunction","no override")
ticker.station_explosion_cinematic(parameter,override)
return

View File

@@ -426,15 +426,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
/client/proc/cmd_switch_radio()
set category = "Debug"
set name = "Switch Radio Mode"
set desc = "Toggle between normal radios and experimental radios. Have a coder present if you do this."
GLOBAL_RADIO_TYPE = !GLOBAL_RADIO_TYPE // toggle
log_admin("[key_name(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].")
message_admins("[key_name_admin(src)] has turned the experimental radio system [GLOBAL_RADIO_TYPE ? "on" : "off"].", 0)
feedback_add_details("admin_verb","SRM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_areatest()
set category = "Mapping"

View File

@@ -264,7 +264,7 @@ client/proc/one_click_antag()
if(nuke_spawn)
var/obj/item/weapon/paper/P = new
P.info = "Sadly, the Syndicate could not get you a nuclear bomb. We have, however, acquired the arming code for the station's onboard nuke. The nuclear authorization code is: <b>[nuke_code]</b>"
P.info = "Sadly, your employers could not get you a nuclear bomb. They have, however, acquired the arming code for the station's onboard nuke. The nuclear authorization code is: <b>[nuke_code]</b>"
P.name = "nuclear bomb code and instructions"
P.loc = nuke_spawn.loc
@@ -327,7 +327,7 @@ client/proc/one_click_antag()
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
for(var/mob/dead/observer/G in player_list)
spawn(0)
switch(alert(G,"Do you wish to be considered for an elite syndicate strike team being sent in?","Please answer in 30 seconds!","Yes","No"))
switch(alert(G,"Do you wish to be considered for an elite mercenary strike team being sent in?","Please answer in 30 seconds!","Yes","No"))
if("Yes")
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
return
@@ -369,7 +369,7 @@ client/proc/one_click_antag()
//So they don't forget their code or mission.
new_syndicate_commando << "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"<B>LEADER</B>"] in the service of the Syndicate. \nYour current mission is: \red<B> [input]</B>"
new_syndicate_commando << "\blue You are an Elite Mercenary. [!syndicate_leader_selected?"commando":"<B>LEADER</B>"] in the service of criminal elements hostile to NanoTrasen. \nYour current mission is: \red<B> [input]</B>"
numagents--
if(numagents >= 6)
@@ -424,7 +424,7 @@ client/proc/one_click_antag()
//Creates mind stuff.
new_syndicate_commando.mind_initialize()
new_syndicate_commando.mind.assigned_role = "MODE"
new_syndicate_commando.mind.special_role = "Syndicate Commando"
new_syndicate_commando.mind.special_role = "Mercenary"
//Adds them to current traitor list. Which is really the extra antagonist list.
ticker.mode.traitors += new_syndicate_commando.mind

View File

@@ -34,5 +34,5 @@
/proc/Syndicate_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
msg = "\blue <b><font color=crimson>SYNDICATE:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;SyndicateReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
msg = "\blue <b><font color=crimson>ILLEGAL:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[Sender]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=\ref[Sender]'>JMP</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;SyndicateReply=\ref[Sender]'>RPLY</A>):</b> [msg]"
admins << msg

View File

@@ -453,7 +453,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
new_character.loc = pick(wizardstart)
//ticker.mode.learn_basic_spells(new_character)
ticker.mode.equip_wizard(new_character)
if("Syndicate")
if("Mercenary")
var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn")
if(synd_spawn)
new_character.loc = get_turf(synd_spawn)

View File

@@ -4,7 +4,7 @@ var/const/syndicate_commandos_possible = 6 //if more Commandos are needed in the
var/global/sent_syndicate_strike_team = 0
/client/proc/syndicate_strike_team()
set category = "Fun"
set name = "Spawn Syndicate Strike Team"
set name = "Spawn Mercenary Strike Team"
set desc = "Spawns a squad of commandos in the Syndicate Mothership if you want to run an admin event."
if(!src.holder)
src << "Only administrators may use this command."
@@ -16,15 +16,15 @@ var/global/sent_syndicate_strike_team = 0
// alert("Not so fast, buddy. Wait a few minutes until the game gets going. There are [(6000-world.time)/10] seconds remaining.")
// return
if(sent_syndicate_strike_team == 1)
alert("The Syndicate are already sending a team, Mr. Dumbass.")
alert("Criminal elements are already sending a team, Mr. Dumbass.")
return
if(alert("Do you want to send in the Syndicate Strike Team? Once enabled, this is irreversible.",,"Yes","No")=="No")
if(alert("Do you want to send in the Mercenary Strike Team? Once enabled, this is irreversible.",,"Yes","No")=="No")
return
alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned syndicates have internals cameras which are viewable through a monitor inside the Syndicate Mothership Bridge. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.")
alert("This 'mode' will go on until everyone is dead or the station is destroyed. You may also admin-call the evac shuttle when appropriate. Spawned mercs have internals cameras which are viewable through a monitor inside the Syndicate Mothership Bridge. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.")
var/input = null
while(!input)
input = copytext(sanitize(input(src, "Please specify which mission the syndicate strike team shall undertake.", "Specify Mission", "")),1,MAX_MESSAGE_LEN)
input = copytext(sanitize(input(src, "Please specify which mission the strike team shall undertake.", "Specify Mission", "")),1,MAX_MESSAGE_LEN)
if(!input)
if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes")
return
@@ -81,7 +81,7 @@ var/global/sent_syndicate_strike_team = 0
new_syndicate_commando.mind.store_memory("<B>Nuke Code:</B> \red [nuke_code].")
new_syndicate_commando.mind.store_memory("<B>Mission:</B> \red [input].")
new_syndicate_commando << "\blue You are an Elite Syndicate. [!syndicate_leader_selected?"commando":"<B>LEADER</B>"] in the service of the Syndicate. \nYour current mission is: \red<B>[input]</B>"
new_syndicate_commando << "\blue You are an Elite Mercenary. [!syndicate_leader_selected?"commando":"<B>LEADER</B>"] in the service of criminal elements hostile to NanoTrasen. \nYour current mission is: \red<B>[input]</B>"
syndicate_commando_number--
@@ -98,8 +98,8 @@ var/global/sent_syndicate_strike_team = 0
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
del(L)
message_admins("\blue [key_name_admin(usr)] has spawned a Syndicate strike squad.", 1)
log_admin("[key_name(usr)] used Spawn Syndicate Squad.")
message_admins("\blue [key_name_admin(usr)] has spawned a mercenary strike squad.", 1)
log_admin("[key_name(usr)] used Spawn Mercenary Squad.")
feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/create_syndicate_death_commando(obj/spawn_location, syndicate_leader_selected = 0)
@@ -121,7 +121,7 @@ var/global/sent_syndicate_strike_team = 0
//Creates mind stuff.
new_syndicate_commando.mind_initialize()
new_syndicate_commando.mind.assigned_role = "MODE"
new_syndicate_commando.mind.special_role = "Syndicate Commando"
new_syndicate_commando.mind.special_role = "Mercenary"
ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list.
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
del(spawn_location)
@@ -171,7 +171,7 @@ var/global/sent_syndicate_strike_team = 0
W.icon_state = "id"
W.access = get_all_accesses()//They get full station access because obviously the syndicate has HAAAX, and can make special IDs for their most elite members.
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage, access_syndicate)//Let's add their forged CentCom access and syndicate access.
W.assignment = "Syndicate Commando"
W.assignment = "Mercenary"
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)

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]"

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