Merge branch 'master' of https://github.com/tgstation/-tg-station into DnaMonkeyStuff

Conflicts:
	code/__HELPERS/unsorted.dm
	code/modules/admin/verbs/one_click_antag.dm
This commit is contained in:
phil235
2015-09-19 22:34:30 +02:00
117 changed files with 11008 additions and 75367 deletions
+10 -100
View File
@@ -232,7 +232,7 @@
/datum/admins/proc/makeNukeTeam()
var/datum/game_mode/nuclear/temp = new
var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a nuke team being sent in?", "operative", temp)
var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for a nuke team being sent in?", "operative", temp)
var/list/mob/dead/observer/chosen = list()
var/mob/dead/observer/theghost = null
@@ -306,7 +306,7 @@
// DEATH SQUADS
/datum/admins/proc/makeDeathsquad()
var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.")
var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null)
var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null)
var/squadSpawned = 0
if(candidates.len >= 2) //Minimum 2 to be considered a squad
@@ -326,13 +326,13 @@
//Spawn and equip the commando
var/mob/living/carbon/human/Commando = new(spawnloc)
chosen_candidate.client.prefs.copy_to(Commando)
ready_dna(Commando)
if(numagents == 1) //If Squad Leader
Commando.real_name = "Officer [pick(commando_names)]"
Commando.equipOutfit(/datum/outfit/death_commando/officer)
else
Commando.real_name = "Trooper [pick(commando_names)]"
Commando.equipOutfit(/datum/outfit/death_commando)
Commando.dna.update_dna_identity()
Commando.key = chosen_candidate.key
Commando.mind.assigned_role = "Death Commando"
for(var/obj/machinery/door/poddoor/ert/door in airlocks)
@@ -412,7 +412,7 @@
/datum/admins/proc/makeOfficial()
var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.")
var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered to be a Centcom Official?", "pAI")
var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered to be a Centcom Official?", "pAI")
if(candidates.len)
var/mob/dead/observer/chosen_candidate = pick(candidates)
@@ -420,8 +420,8 @@
//Create the official
var/mob/living/carbon/human/newmob = new (pick(emergencyresponseteamspawn))
chosen_candidate.client.prefs.copy_to(newmob)
ready_dna(newmob)
newmob.real_name = newmob.dna.species.random_name(newmob.gender,1)
newmob.dna.update_dna_identity()
newmob.key = chosen_candidate.key
newmob.mind.assigned_role = "Centcom Official"
newmob.equipOutfit(/datum/outfit/centcom_official)
@@ -465,7 +465,7 @@
return makeOfficial()
var/teamsize = min(7,input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num)
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.")
var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null)
var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for a Code [alert] Nanotrasen Emergency Response Team?", "deathsquad", null)
var/teamSpawned = 0
if(candidates.len > 0)
@@ -490,6 +490,7 @@
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
var/list/lastname = last_names
chosen_candidate.client.prefs.copy_to(ERTOperative)
ready_dna(ERTOperative)
var/ertname = pick(lastname)
switch(numagents)
if(1)
@@ -513,7 +514,6 @@
if(7)
ERTOperative.real_name = "Engineer [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
ERTOperative.dna.update_dna_identity()
ERTOperative.key = chosen_candidate.key
ERTOperative.mind.assigned_role = "ERT"
@@ -558,50 +558,11 @@
//Abductors
/datum/admins/proc/makeAbductorTeam()
var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an Abductor Team?", "abductor", null)
if(candidates.len >= 2)
//Oh god why we can't have static functions
var/number = ticker.mode.abductor_teams + 1
var/datum/game_mode/abduction/temp
if(ticker.mode.config_tag == "abduction")
temp = ticker.mode
else
temp = new
var/agent_mind = pick(candidates)
candidates -= agent_mind
var/scientist_mind = pick(candidates)
var/mob/living/carbon/human/agent=makeBody(agent_mind)
var/mob/living/carbon/human/scientist=makeBody(scientist_mind)
agent_mind = agent.mind
scientist_mind = scientist.mind
temp.scientists.len = number
temp.agents.len = number
temp.abductors.len = 2*number
temp.team_objectives.len = number
temp.team_names.len = number
temp.scientists[number] = scientist_mind
temp.agents[number] = agent_mind
temp.abductors |= list(agent_mind,scientist_mind)
temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind)
temp.post_setup_team(number)
ticker.mode.abductor_teams++
if(ticker.mode.config_tag != "abduction")
ticker.mode.abductors |= temp.abductors
return 1
else
return
new /datum/round_event/abductor
return 1
/datum/admins/proc/makeRevenant()
var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for becoming a revenant?", "revenant", null)
var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for becoming a revenant?", "revenant", null)
if(candidates.len >= 1)
var/spook_op = pick(candidates)
var/mob/dead/observer/O = spook_op
@@ -643,54 +604,3 @@
candidates.Remove(H)
return 1
return 0
/datum/admins/proc/getCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck)
var/list/mob/dead/observer/candidates = list()
var/time_passed = world.time
if (!Question)
Question = "Would you like to be a special role?"
for(var/mob/dead/observer/G in player_list)
if(!G.key || !G.client)
continue
if (gametypeCheck)
if(!gametypeCheck.age_check(G.client))
continue
if (jobbanType)
if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate"))
continue
spawn(0)
G << 'sound/misc/notice2.ogg' //Alerting them to their consideration
switch(alert(G,Question,"Please answer in 30 seconds!","Yes","No"))
if("Yes")
G << "<span class='notice'>Choice registered: Yes.</span>"
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
G << "<span class='danger'>Sorry, you were too late for the consideration!</span>"
G << 'sound/machines/buzz-sigh.ogg'
return
candidates += G
if("No")
G << "<span class='danger'>Choice registered: No.</span>"
return
else
return
sleep(300)
//Check all our candidates, to make sure they didn't log off during the 30 second wait period.
for(var/mob/dead/observer/G in candidates)
if(!G.key || !G.client)
candidates.Remove(G)
return candidates
/datum/admins/proc/makeBody(mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character
if(!G_found || !G_found.key) return
//First we spawn a dude.
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
G_found.client.prefs.copy_to(new_character)
new_character.dna.update_dna_identity()
new_character.key = G_found.key
return new_character
+2 -2
View File
@@ -40,7 +40,7 @@
var/turf/T = get_turf(src)
T.visible_message("<span class='disarm'>[src] emits a blinding light!</span>")
for(var/mob/living/carbon/M in viewers(3, null))
flash_carbon(M, null, 2, 0)
flash_carbon(M, null, 5, 0)
/obj/item/device/assembly/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
@@ -79,7 +79,7 @@
return 1
/obj/item/device/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 5, targeted = 1)
/obj/item/device/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 15, targeted = 1)
add_logs(user, M, "flashed", src)
if(user && targeted)
if(M.weakeyes)
+2
View File
@@ -9,6 +9,7 @@
strip_delay = 70
put_on_delay = 70
burn_state = -1 //Won't burn in fires
origin_tech = "magnets=2"
/obj/item/clothing/shoes/magboots/verb/toggle()
set name = "Toggle Magboots"
@@ -52,3 +53,4 @@
name = "blood-red magboots"
icon_state = "syndiemag0"
magboot_state = "syndiemag"
origin_tech = "magnets=2,syndicate=3"
+2 -2
View File
@@ -270,7 +270,7 @@
item_state = "wiz_helm"
item_color = "wiz"
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
armor = list(melee = 40, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 100, rad = 50)
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -284,7 +284,7 @@
slowdown = 1
w_class = 3
unacidable = 1
armor = list(melee = 40, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 100, rad = 50)
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank/internals)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
@@ -19,6 +19,11 @@
volume = 5
spillable = 0
/obj/item/weapon/reagent_containers/glass/rag/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] ties the [src.name] around their head and groans! It looks like--</span>")
user.say("MY BRAIN HURTS!!")
return (OXYLOSS)
/obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity)
if(!proximity)
return
+1
View File
@@ -12,6 +12,7 @@
slot_flags = SLOT_BELT
var/scanning = 0
var/list/log = list()
origin_tech = "engineering=3;biotech=2"
/obj/item/device/detective_scanner/attack_self(mob/user)
if(log.len && !scanning)
+61
View File
@@ -0,0 +1,61 @@
/datum/round_event_control/abductor
name = "Abductors"
typepath = /datum/round_event/abductor
weight = 5
max_occurrences = 1
earliest_start = 180000 // 30 min
gamemode_blacklist = list("nuclear","wizard","revolution","abduction")
/datum/round_event/abductor
/datum/round_event/abductor/start()
//spawn abductor team
if(!makeAbductorTeam())
message_admins("Abductor event failed to find players. Retrying in 30s.")
spawn(30)
makeAbductorTeam()
/datum/round_event/abductor/proc/makeAbductorTeam()
var/list/mob/dead/observer/candidates = pollCandidates("Do you wish to be considered for an Abductor Team?", "abductor", null)
if(candidates.len >= 2)
//Oh god why we can't have static functions
var/number = ticker.mode.abductor_teams + 1
var/datum/game_mode/abduction/temp
if(ticker.mode.config_tag == "abduction")
temp = ticker.mode
else
temp = new
var/agent_mind = pick(candidates)
candidates -= agent_mind
var/scientist_mind = pick(candidates)
var/mob/living/carbon/human/agent=makeBody(agent_mind)
var/mob/living/carbon/human/scientist=makeBody(scientist_mind)
agent_mind = agent.mind
scientist_mind = scientist.mind
temp.scientists.len = number
temp.agents.len = number
temp.abductors.len = 2*number
temp.team_objectives.len = number
temp.team_names.len = number
temp.scientists[number] = scientist_mind
temp.agents[number] = agent_mind
temp.abductors |= list(agent_mind,scientist_mind)
temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind)
temp.post_setup_team(number)
ticker.mode.abductor_teams++
if(ticker.mode.config_tag != "abduction")
ticker.mode.abductors |= temp.abductors
return 1
else
return 0
+2
View File
@@ -6,6 +6,8 @@
earliest_start = 48000 // 1 hour 20 minutes
gamemode_blacklist = list("blob") // Just in case blob survives that long
/datum/round_event/blob
announceWhen = 12
endWhen = 120
+3
View File
@@ -20,6 +20,9 @@
var/alertadmins = 1 //should we let the admins know this event is firing
//should be disabled on events that fire a lot
var/gamemode_blacklist = list() // Event won't happen in these gamemodes
var/gamemode_whitelist = list() // Event will happen ONLY in these gamemodes if not empty
/datum/round_event_control/wizard
wizardevent = 1
+2 -2
View File
@@ -230,9 +230,9 @@
if (mutmod == 2)
if(prob(50)) //50%
mutate()
else if(prob(75)) //37.5%
else if(prob(50)) //25%
hardmutate()
else if(prob(10)) //1/80
else if(prob(50)) //12.5%
mutatespecie()
return
return
+4
View File
@@ -507,6 +507,7 @@
var/fieldsactive = 0
var/burst_time = 50
var/fieldlimit = 3
origin_tech = "magnets=2;combat=2"
/obj/item/weapon/resonator/proc/CreateResonance(target, creator)
var/turf/T = get_turf(target)
@@ -724,6 +725,7 @@
throw_range = 5
var/loaded = 1
var/malfunctioning = 0
origin_tech = "biotech=4"
/obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
if(!loaded)
@@ -778,6 +780,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 0
origin_tech = "engineering=1;magnets=1"
/obj/item/device/mining_scanner/attack_self(mob/user)
if(!user.client)
@@ -809,6 +812,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 0
origin_tech = "engineering=3;magnets=3"
/obj/item/device/t_scanner/adv_mining_scanner/scan()
if(!cooldown)
@@ -24,6 +24,8 @@
if(I == head)
head = null
if(I.flags & BLOCKHAIR)
update_hair()
update_inv_head()
else if(I == back)
back = null
@@ -1,99 +0,0 @@
#define BORG_CAMERA_BUFFER 30
//UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update.
// TURFS
/turf
var/image/obscured
/turf/proc/visibilityChanged()
if(ticker)
cameranet.updateVisibility(src)
/turf/simulated/Del()
visibilityChanged()
..()
/turf/simulated/New()
..()
visibilityChanged()
// STRUCTURES
/obj/structure/Destroy()
if(ticker)
cameranet.updateVisibility(src)
return ..()
/obj/structure/New()
..()
if(ticker)
cameranet.updateVisibility(src)
// EFFECTS
/obj/effect/Destroy()
if(ticker)
cameranet.updateVisibility(src)
return ..()
/obj/effect/New()
..()
if(ticker)
cameranet.updateVisibility(src)
// DOORS
// Simply updates the visibility of the area when it opens/closes/destroyed.
/obj/machinery/door/proc/update_freelook_sight()
// Glass door glass = 1
// don't check then?
if(!glass && cameranet)
cameranet.updateVisibility(src, 0)
// ROBOT MOVEMENT
// Update the portable camera everytime the Robot moves.
// This might be laggy, comment it out if there are problems.
/mob/living/silicon/robot/var/updating = 0
/mob/living/silicon/robot/Move()
var/oldLoc = src.loc
. = ..()
if(.)
if(src.camera)
if(!updating)
updating = 1
spawn(BORG_CAMERA_BUFFER)
if(oldLoc != src.loc)
cameranet.updatePortableCamera(src.camera)
updating = 0
// CAMERA
// An addition to deactivate which removes/adds the camera from the chunk list based on if it works or not.
/obj/machinery/camera/deactivate(mob/user, choice = 1)
..(user, choice)
if(src.can_use())
cameranet.addCamera(src)
else
src.SetLuminosity(0)
cameranet.removeCamera(src)
/obj/machinery/camera/New()
..()
cameranet.cameras += src
cameranet.addCamera(src)
/obj/machinery/camera/Destroy()
cameranet.cameras -= src
cameranet.removeCamera(src)
return ..()
#undef BORG_CAMERA_BUFFER
+2
View File
@@ -3,4 +3,6 @@
ticker.mode.remove_cultist(mind, 0)
ticker.mode.remove_revolutionary(mind, 0)
ticker.mode.remove_gangster(mind, remove_bosses=1)
ticker.mode.remove_thrall(mind,0)
ticker.mode.remove_shadowling(mind)
..()
@@ -6,6 +6,7 @@
if(mind) ticker.mode.remove_revolutionary(mind)
if(mind) ticker.mode.remove_gangster(mind,1,remove_bosses=1)
if(mind) ticker.mode.remove_thrall(mind,0)
if(mind) ticker.mode.remove_shadowling(mind)
/mob/living/silicon/robot/update_hotkey_mode()
winset(src, null, "mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
+13 -1
View File
@@ -67,6 +67,8 @@
var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
var/updating = 0 //portable camera camerachunk update
/mob/living/silicon/robot/New(loc)
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
@@ -882,9 +884,18 @@
/mob/living/silicon/robot/proc/radio_menu()
radio.interact(src)//Just use the radio's Topic() instead of bullshit special-snowflake code
#define BORG_CAMERA_BUFFER 30
/mob/living/silicon/robot/Move(a, b, flag)
var/oldLoc = src.loc
. = ..()
if(.)
if(src.camera)
if(!updating)
updating = 1
spawn(BORG_CAMERA_BUFFER)
if(oldLoc != src.loc)
cameranet.updatePortableCamera(src.camera)
updating = 0
if(module)
if(module.type == /obj/item/weapon/robot_module/janitor)
var/turf/tile = loc
@@ -924,6 +935,7 @@
loc.attackby(module_state_2,src)
else if(istype(module_state_3,/obj/item/weapon/storage/bag/ore))
loc.attackby(module_state_3,src)
#undef BORG_CAMERA_BUFFER
/mob/living/silicon/robot/proc/self_destruct()
if(emagged)
@@ -60,7 +60,7 @@
faction = list("swarmer")
AIStatus = AI_OFF
projectiletype = /obj/item/projectile/beam/disabler
pass_flags = PASSTABLE | PASSMOB
pass_flags = PASSTABLE
ventcrawler = 2
ranged = 1
projectiletype = /obj/item/projectile/beam/disabler
@@ -95,8 +95,9 @@
/mob/living/simple_animal/hostile/swarmer/emp_act()
if(health > 1)
health = 1
..()
health = 0
return
else
death()
/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O)
if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
@@ -172,6 +173,12 @@
/obj/machinery/dominator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This device is attempting to corrupt our entire network; attempting to interact with it is too risky. Aborting.</span>"
/obj/effect/decal/cleanable/crayon/gang/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Searching... sensor malfunction! Target lost. Aborting.</span>"
/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Searching... sensor malfunction! Target lost. Aborting.</span>"
/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Destroying this object would cause a chain reaction. Aborting.</span>"
@@ -181,6 +188,15 @@
/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>An inhospitable area may be created as a result of destroying this object. Aborting.</span>"
/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.</span>"
/obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.</span>"
/obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. </span>"
/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>"
@@ -188,15 +204,17 @@
S << "<span class='warning'>This bluespace source will be important to us later. Aborting.</span>"
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(locate(/turf/space) in range(1, src))
S << "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>"
return
for(var/turf/T in range(1, src))
if(istype(T, /turf/space) || istype(T.loc, /area/space))
S << "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>"
return
..()
/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(locate(/turf/space) in range(1, src))
S << "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>"
return
for(var/turf/T in range(1, src))
if(istype(T, /turf/space) || istype(T.loc, /area/space))
S << "<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>"
return
..()
/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource
@@ -233,6 +251,10 @@
resources++
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
var/obj/effect/swarmer/integrate/I = new /obj/effect/swarmer/integrate(get_turf(target))
I.pixel_x = target.pixel_x
I.pixel_y = target.pixel_y
I.pixel_z = target.pixel_z
if(istype(target, /obj/item/stack))
var/obj/item/stack/S = target
S.use(1)
@@ -244,7 +266,7 @@
return
/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target)
new /obj/effect/effect/sparks(get_turf(target))
new /obj/effect/swarmer/disintegration(get_turf(target))
do_attack_animation(target)
changeNext_move(CLICK_CD_MELEE)
target.ex_act(3)
@@ -280,14 +302,20 @@
/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target)
do_attack_animation(target)
src << "<span class='info'>We begin to dismantle this machine. We will need to be uninterrupted.</span>"
new /obj/effect/effect/sparks(get_turf(target))
var/obj/effect/swarmer/dismantle/D = new /obj/effect/swarmer/dismantle(get_turf(target))
D.pixel_x = target.pixel_x
D.pixel_y = target.pixel_y
D.pixel_z = target.pixel_z
if(do_mob(src, target, 100))
src << "<span class='info'>Dismantling complete.</span>"
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc)
M.amount = 5
for(var/obj/item/I in target.component_parts)
I.loc = M.loc
new /obj/effect/effect/sparks(get_turf(target))
var/obj/effect/swarmer/disintegration/N = new /obj/effect/swarmer/disintegration(get_turf(target))
N.pixel_x = target.pixel_x
N.pixel_y = target.pixel_y
N.pixel_z = target.pixel_z
target.dropContents()
if(istype(target, /obj/machinery/computer))
var/obj/machinery/computer/C = target
@@ -295,42 +323,75 @@
C.circuit.loc = M.loc
qdel(target)
/obj/effect/swarmer //Default destroyable object for swarmer constructions
name = "swarmer construction"
desc = "Debug swarmer item, this shouldn't be here. Yell at a coder."
/obj/effect/swarmer //Default swarmer effect object visual feedback
name = "swarmer ui"
desc = null
gender = NEUTER
icon = 'icons/mob/swarmer.dmi'
icon_state = "ui_light"
mouse_opacity = 0
layer = 4
unacidable = 1
/obj/effect/swarmer/disintegration
icon_state = "disintegrate"
/obj/effect/swarmer/disintegration/New()
playsound(src.loc, "sparks", 100, 1)
spawn(10)
qdel(src)
/obj/effect/swarmer/dismantle
icon_state = "dismantle"
/obj/effect/swarmer/dismantle/New()
spawn(25)
qdel(src)
/obj/effect/swarmer/integrate
icon_state = "integrate"
/obj/effect/swarmer/integrate/New()
spawn(5)
qdel(src)
/obj/effect/swarmer/destructible //Default destroyable object for swarmer constructions
luminosity = 1
mouse_opacity = 1
var/health = 30
/obj/effect/swarmer/proc/TakeDamage(damage)
/obj/effect/swarmer/destructible/proc/TakeDamage(damage)
health -= damage
if(health <= 0)
qdel(src)
/obj/effect/swarmer/bullet_act(obj/item/projectile/Proj)
/obj/effect/swarmer/destructible/bullet_act(obj/item/projectile/Proj)
if(Proj.damage)
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
TakeDamage(Proj.damage)
..()
/obj/effect/swarmer/attackby(obj/item/weapon/I, mob/living/user, params)
/obj/effect/swarmer/destructible/attackby(obj/item/weapon/I, mob/living/user, params)
if(istype(I, /obj/item/weapon))
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
TakeDamage(I.force)
return
/obj/effect/swarmer/ex_act()
/obj/effect/swarmer/destructible/ex_act()
qdel(src)
return
/obj/effect/swarmer/blob_act()
/obj/effect/swarmer/destructible/blob_act()
qdel(src)
return
/obj/effect/swarmer/attack_animal(mob/living/user)
/obj/effect/swarmer/destructible/emp_act()
qdel(src)
return
/obj/effect/swarmer/destructible/attack_animal(mob/living/user)
if(isanimal(user))
var/mob/living/simple_animal/S = user
S.do_attack_animation(src)
@@ -343,24 +404,27 @@
set name = "Create trap"
set category = "Swarmer"
set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources"
if(/obj/effect/swarmer/trap in loc)
if(/obj/effect/swarmer/destructible/trap in loc)
src << "<span class='warning'>There is already a trap here. Aborting.</span>"
return
Fabricate(/obj/effect/swarmer/trap, 5)
Fabricate(/obj/effect/swarmer/destructible/trap, 5)
return
/obj/effect/swarmer/trap
/obj/effect/swarmer/destructible/trap
name = "swarmer trap"
desc = "A quickly assembled electric trap. Will not retain its form if damaged enough."
desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough."
icon_state = "trap"
luminosity = 1
health = 10
/obj/effect/swarmer/trap/Crossed(var/atom/movable/AM)
/obj/effect/swarmer/destructible/trap/Crossed(var/atom/movable/AM)
if(isliving(AM))
var/mob/living/L = AM
if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
playsound(loc,'sound/effects/snap.ogg',50, 1, -1)
L.electrocute_act(0, src, 1, 1)
if(isrobot(L))
L.Weaken(5)
qdel(src)
..()
@@ -368,13 +432,17 @@
set name = "Create barricade"
set category = "Swarmer"
set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through."
if(/obj/effect/swarmer/blockade in loc)
if(/obj/effect/swarmer/destructible/blockade in loc)
src << "<span class='warning'>There is already a blockade here. Aborting.</span>"
return
Fabricate(/obj/effect/swarmer/blockade, 5)
if(resources < 5)
src << "<span class='warning'>We do not have the resources for this!</span>"
return
if(do_mob(src, src, 10))
Fabricate(/obj/effect/swarmer/destructible/blockade, 5)
return
/obj/effect/swarmer/blockade
/obj/effect/swarmer/destructible/blockade
name = "swarmer blockade"
desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through."
icon_state = "barricade"
@@ -383,7 +451,7 @@
density = 1
anchored = 1
/obj/effect/swarmer/blockade/CanPass(atom/movable/O)
/obj/effect/swarmer/destructible/blockade/CanPass(atom/movable/O)
if(isswarmer(O))
return 1
if(istype(O, /obj/item/projectile/beam/disabler))
@@ -436,7 +504,7 @@
/obj/screen/swarmer/FabricateTrap
icon_state = "ui_trap"
name = "Create trap"
name = "Create trap (Costs 5 Resources)"
desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)"
/obj/screen/swarmer/FabricateTrap/Click()
@@ -446,7 +514,7 @@
/obj/screen/swarmer/Barricade
icon_state = "ui_barricade"
name = "Create barricade"
name = "Create barricade (Costs 5 Resources)"
desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)"
/obj/screen/swarmer/Barricade/Click()
@@ -456,8 +524,8 @@
/obj/screen/swarmer/Replicate
icon_state = "ui_replicate"
name = "Replicate"
desc = "Creates a another of our kind. (Costs 50 resources)"
name = "Replicate (Costs 50 Resources)"
desc = "Creates a another of our kind."
/obj/screen/swarmer/Replicate/Click()
if(isswarmer(usr))
@@ -223,22 +223,21 @@
var/target = the_target
visible_message("<span class='danger'><b>[src]</b> [ranged_message] at [target]!</span>")
var/tturf = get_turf(target)
if(rapid)
spawn(1)
Shoot(tturf, src.loc, src)
Shoot(target, src.loc, src)
if(casingtype)
new casingtype(get_turf(src))
spawn(4)
Shoot(tturf, src.loc, src)
Shoot(target, src.loc, src)
if(casingtype)
new casingtype(get_turf(src))
spawn(6)
Shoot(tturf, src.loc, src)
Shoot(target, src.loc, src)
if(casingtype)
new casingtype(get_turf(src))
else
Shoot(tturf, src.loc, src)
Shoot(target, src.loc, src)
if(casingtype)
new casingtype
ranged_cooldown = ranged_cooldown_cap
@@ -248,17 +247,16 @@
if(target == start)
return
var/obj/item/projectile/A = new projectiletype(user:loc)
var/obj/item/projectile/A = new projectiletype(src.loc)
playsound(user, projectilesound, 100, 1)
if(!A) return
if (!istype(target, /turf))
qdel(A)
return
A.current = target
A.firer = src
A.yo = target:y - start:y
A.xo = target:x - start:x
if(AIStatus == AI_OFF)//Don't want mindless mobs to have their movement screwed up firing in space
newtonian_move(get_dir(target, user))
A.original = target
A.fire()
return
+9 -2
View File
@@ -200,8 +200,15 @@
M.animate_movement = 2
return
if(mob.confused && IsEven(world.time))
step(mob, pick(cardinal))
if(mob.confused)
if(mob.confused > 40)
step(mob, pick(cardinal))
else if(prob(mob.confused * 1.5))
step(mob, angle2dir(dir2angle(direct) + pick(90, -90)))
else if(prob(mob.confused * 3))
step(mob, angle2dir(dir2angle(direct) + pick(45, -45)))
else
step(mob, direct)
else
. = ..()
+1 -1
View File
@@ -51,7 +51,7 @@
/obj/item/weapon/paper/examine(mob/user)
..()
if(in_range(user, src))
if(in_range(user, src) || isobserver(user))
if( !(ishuman(user) || isobserver(user) || issilicon(user)) )
user << browse("<HTML><HEAD><TITLE>[name]</TITLE></HEAD><BODY>[stars(info)]<HR>[stamps]</BODY></HTML>", "window=[name]")
onclose(user, "[name]")
@@ -13,18 +13,30 @@
caliber = "38"
projectile_type = /obj/item/projectile/bullet/weakbullet2
/obj/item/ammo_casing/c10mm
desc = "A 10mm bullet casing."
caliber = "10mm"
projectile_type = /obj/item/projectile/bullet/midbullet3
/obj/item/ammo_casing/c9mm
desc = "A 9mm bullet casing."
caliber = "9mm"
projectile_type = /obj/item/projectile/bullet/weakbullet3
/obj/item/ammo_casing/c9mmap
desc = "A 9mm bullet casing."
caliber = "9mm"
projectile_type =/obj/item/projectile/bullet/armourpiercing
/obj/item/ammo_casing/c9mmtox
desc = "A 9mm bullet casing."
caliber = "9mm"
projectile_type = /obj/item/projectile/bullet/toxinbullet
/obj/item/ammo_casing/c9mminc
desc = "A 9mm bullet casing."
caliber = "9mm"
projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
/obj/item/ammo_casing/c45
desc = "A .45 bullet casing."
@@ -134,6 +134,29 @@
..()
icon_state = "45-[ammo_count() ? "8" : "0"]"
/obj/item/ammo_box/magazine/wt550m9
name = "wt550 magazine (9mm)"
icon_state = "9mmt-20"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = "9mm"
max_ammo = 20
/obj/item/ammo_box/magazine/wt550m9/update_icon()
..()
icon_state = "9mmt-[round(ammo_count(),4)]"
/obj/item/ammo_box/magazine/wt550m9/wtap
name = "wt550 magazine (Armour Piercing 9mm)"
ammo_type = /obj/item/ammo_casing/c9mmap
/obj/item/ammo_box/magazine/wt550m9/wttx
name = "wt550 magazine (Toxin Tipped 9mm)"
ammo_type = /obj/item/ammo_casing/c9mmtox
/obj/item/ammo_box/magazine/wt550m9/wtic
name = "wt550 magazine (Incindiary 9mm)"
ammo_type = /obj/item/ammo_casing/c9mminc
/obj/item/ammo_box/magazine/uzim9mm
name = "uzi magazine (9mm)"
icon_state = "uzi9mm-32"
@@ -147,14 +170,22 @@
/obj/item/ammo_box/magazine/smgm9mm
name = "SMG magazine (9mm)"
icon_state = "smg9mm-20"
icon_state = "smg9mm-42"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = "9mm"
max_ammo = 20
max_ammo = 42
/obj/item/ammo_box/magazine/smgm9mm/update_icon()
..()
icon_state = "smg9mm-[round(ammo_count(),5)]"
/obj/item/ammo_box/magazine/smgm9mm/ap
name = "SMG magazine (Armour Piercing 9mm)"
ammo_type = /obj/item/ammo_casing/c9mmap
/obj/item/ammo_box/magazine/smgm9mm/toxin
name = "SMG magazine (Toxin Tipped 9mm)"
ammo_type = /obj/item/ammo_casing/c9mmtox
/obj/item/ammo_box/magazine/smgm9mm/fire
name = "SMG Magazine (Incindiary 9mm)"
ammo_type = /obj/item/ammo_casing/c9mminc
/obj/item/ammo_box/magazine/smgm45
name = "SMG magazine (.45)"
@@ -140,6 +140,7 @@
var/overheat_time = 16
var/recent_reload = 1
unique_rename = 1
origin_tech = "combat=2;powerstorage=1"
/obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot()
overheat = 1
@@ -109,6 +109,21 @@
icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
return
/obj/item/weapon/gun/projectile/automatic/wt550
name = "security auto rifle"
desc = "A outdated personal defence weapon. Uses 9mm rounds and is designated the WT-550 Automatic Rifle."
icon_state = "wt550"
item_state = "arg"
mag_type = /obj/item/ammo_box/magazine/wt550m9
fire_delay = 2
can_suppress = 0
burst_size = 0
/obj/item/weapon/gun/projectile/automatic/wt550/update_icon()
..()
icon_state = "wt550[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""]"
return
/obj/item/weapon/gun/projectile/automatic/mini_uzi
name = "\improper 'Type U3' Uzi"
desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds."
+11 -1
View File
@@ -11,7 +11,6 @@
damage = 5
stamina = 80
/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down
damage = 15
weaken = 3
@@ -20,6 +19,17 @@
/obj/item/projectile/bullet/weakbullet3
damage = 20
/obj/item/projectile/bullet/toxinbullet
damage = 15
damage_type = TOX
/obj/item/projectile/bullet/incendiary/firebullet
damage = 10
/obj/item/projectile/bullet/armourpiercing
damage = 17
armour_penetration = 10
/obj/item/projectile/bullet/pellet
name = "pellet"
damage = 15
@@ -49,8 +49,6 @@
/datum/reagent/proc/on_mob_life(mob/living/M)
current_cycle++
if(!istype(M, /mob/living))
return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO
holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
return
@@ -29,7 +29,7 @@
M.Dizzy(5)
if(current_cycle >= boozepwr*2.5 && prob(33))
if (!M.confused) M.confused = 1
M.confused += 3
M.confused += 2
if(current_cycle >= boozepwr*10 && prob(33))
M.adjustToxLoss(2)
..()
+1 -1
View File
@@ -40,7 +40,7 @@ other types of metals and chemistry for reagents).
var/construction_time //Amount of time required for building the object
var/build_path = "" //The file path of the object that gets created
var/list/category = null //Primarily used for Mech Fabricators, but can be used for anything
var/reagents
var/list/reagents = list() //List of reagents. Format: "id" = amount.
//A proc to calculate the reliability of a design based on tech levels and innate modifiers.
@@ -69,7 +69,8 @@
id = "decloner"
req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, "mutagen" = 40)
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000)
reagents = list("mutagen" = 40)
build_path = /obj/item/weapon/gun/energy/decloner
category = list("Weapons")
@@ -110,7 +111,8 @@
id = "flora_gun"
req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 500, "radium" = 20)
materials = list(MAT_METAL = 2000, MAT_GLASS = 500)
reagents = list("radium" = 20)
build_path = /obj/item/weapon/gun/energy/floragun
category = list("Weapons")
@@ -127,7 +129,7 @@
/datum/design/smg
name = "NanoTrasen Saber SMG"
desc = "A prototype weapon made using lightweight materials on a traditional frame, designed to fire standard 9mm rounds."
desc = "A prototype advancment over the WT-550 auto rifle made using lightweight materials on a traditional frame, designed to fire standard 9mm rounds."
id = "smg"
req_tech = list("combat" = 4, "materials" = 3)
build_type = PROTOLATHE
@@ -175,9 +177,44 @@
build_path = /obj/item/weaponcrafting/reciever
category = list("Weapons")
//WT550 Mags
/datum/design/mag_oldsmg
name = "WT-550 Auto Gun Magazine (9mm)"
desc = "A 20 round magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg"
req_tech = list("combat" = 1, "materials" = 1)
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_box/magazine/wt550m9
category = list("Ammo")
/datum/design/mag_oldsmg/ap_mag
name = "Submachine Gun Armour Piercing Magazine (9mmAP)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg_ap"
materials = list(MAT_METAL = 6000, MAG_SILVER = 200)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtap
/datum/design/mag_oldsmg/ic_mag
name = "Submachine Gun Incindiary Magazine (9mmIC)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg_ic"
materials = list(MAT_METAL = 6000, MAG_SILVER = 200, MAT_GLASS = 800)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
/datum/design/mag_oldsmg/tx_mag
name = "Submachine Gun Urnaium Magazine (9mmTX)"
desc = "A 20 round urnaium tipped magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg_tx"
materials = list(MAT_METAL = 6000, MAG_SILVER = 400, MAG_URNAIUM = 2000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wttx
//SABR Mags
/datum/design/mag_smg
name = "Submachine Gun Magazine (9mm)"
desc = "A 20-round magazine for the prototype submachine gun."
desc = "A 42-round magazine for the prototype submachine gun."
id = "mag_smg"
req_tech = list("combat" = 4, "materials" = 3)
build_type = PROTOLATHE
@@ -185,6 +222,27 @@
build_path = /obj/item/ammo_box/magazine/smgm9mm
category = list("Ammo")
/datum/design/mag_smg/ap_mag
name = "Submachine Gun Armour Piercing Magazine (9mmAP)"
desc = "A 42-round armour piercing magazine for the prototype submachine gun. Deals slightly less damage by bypasses most armour"
id = "mag_smg_ap"
materials = list(MAT_METAL = 3000, MAG_SILVER = 100)
build_path = /obj/item/ammo_box/magazine/smgm9mm/ap
/datum/design/mag_smg/incin_mag
name = "Submachine Gun Incindiary Magazine (9mmIC)"
desc = "A 42-round incindiary round magazine for the prototype submachine gun. Deals significanlty less damage but sets the target on fire"
id = "mag_smg_ic"
materials = list(MAT_METAL = 3000, MAG_SILVER = 100, MAT_GLASS = 400)
build_path = /obj/item/ammo_box/magazine/smgm9mm/fire
/datum/design/mag_smg/incin_tox
name = "Submachine Gun Urnaium Magazine (9mmIC)"
desc = "A 42-round urnaium tipped round magazine for the prototype submachine gun. Deals toxin damage, but less overall damage."
id = "mag_smg_tx"
materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAG_URNAIUM = 1000)
build_path = /obj/item/ammo_box/magazine/smgm9mm/toxin
/datum/design/stunshell
name = "Stun Shell"
desc = "A stunning shell for a shotgun."
+3 -1
View File
@@ -67,7 +67,9 @@ Note: Must be placed west/left of and R&D console to function.
var/A = materials.amount(M)
if(!A)
A = reagents.get_reagent_amount(M)
A = A / max(1, (being_built.materials[M]/efficiency_coeff))
A = A / max(1, (being_built.reagents[M]/efficiency_coeff))
else
A = A / max(1, (being_built.materials[M]/efficiency_coeff))
return A
/obj/machinery/r_n_d/protolathe/attackby(obj/item/O, mob/user, params)
+17
View File
@@ -385,9 +385,17 @@ won't update every console in existence) but it's more of a hassle to do. Also,
src.visible_message("<span class='notice'>The [src.name] beeps, \"Not enough materials to complete prototype.\"</span>")
enough_materials = 0
g2g = 0
else
for(var/R in being_built.reagents)
if(!linked_lathe.reagents.has_reagent(R, being_built.reagents[R]/coeff))
src.visible_message("<span class='notice'>The [src.name] beeps, \"Not enough reagents to complete prototype.\"</span>")
enough_materials = 0
g2g = 0
if(enough_materials)
linked_lathe.materials.use_amount(efficient_mats, amount)
for(var/R in being_built.reagents)
linked_lathe.reagents.remove_reagent(R, being_built.reagents[R]/coeff)
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
var/R = being_built.reliability
@@ -823,6 +831,15 @@ won't update every console in existence) but it's more of a hassle to do. Also,
temp_material += " [D.materials[M]/coeff] [CallMaterialName(M)]"
c = min(c,t)
for(var/R in D.reagents)
t = linked_lathe.check_mat(D, R)
temp_material += " | "
if (t < 1)
temp_material += "<span class='bad'>[D.reagents[R]/coeff] [CallMaterialName(R)]</span>"
else
temp_material += " [D.reagents[R]/coeff] [CallMaterialName(R)]"
c = min(c,t)
if (c >= 1)
dat += "<A href='?src=\ref[src];build=[D.id];amount=1'>[D.name]</A>"
if(c >= 5)