From bae5834be34f2c3bad7472b42ff9870696d5a4c1 Mon Sep 17 00:00:00 2001 From: "mport2004@gmail.com" Date: Fri, 9 Sep 2011 06:15:38 +0000 Subject: [PATCH] Did a bit of work on assemblies. The rev icons bug might be fixed now. Removed the old logged say file as it is no longer used and contained questionable material. People should no longer spawn on the wizard station for a second at round start. Removed the old intercept vars as they have not been used in a good while. Blob is more or less back to its old state but still has the lava sprite, can we please get some new sprites for it. Fixed the door on the prison station, it can now actually be used again. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2163 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/obj.dm | 14 - code/game/gamemodes/blob/blob.dm | 19 +- code/game/gamemodes/blob/theblob.dm | 259 ++++++------ code/game/gamemodes/changeling/changeling.dm | 22 - .../game/gamemodes/changeling/traitor_chan.dm | 8 - code/game/gamemodes/cult/cult.dm | 11 - code/game/gamemodes/extended/extended.dm | 3 - code/game/gamemodes/gameticker.dm | 12 - code/game/gamemodes/intercept_report.dm | 10 +- .../game/gamemodes/malfunction/malfunction.dm | 20 +- code/game/gamemodes/meteor/meteor.dm | 42 +- code/game/gamemodes/nuclear/nuclear.dm | 10 + code/game/gamemodes/revolution/revolution.dm | 33 +- code/game/gamemodes/sandbox/sandbox.dm | 3 - code/game/gamemodes/traitor/traitor.dm | 50 +-- code/game/gamemodes/wizard/spellbook.dm | 341 +++++++++++++++ code/game/gamemodes/wizard/wizard.dm | 393 +----------------- code/modules/assembly/assembly.dm | 55 ++- code/modules/assembly/holder.dm | 92 ++-- code/modules/assembly/infrared.dm | 7 + code/names.dm | 1 - icons/mob/blob.dmi | Bin 10280 -> 57541 bytes maps/tgstation.2.0.8.dmm | 16 +- tgstation.dme | 1 + 24 files changed, 662 insertions(+), 760 deletions(-) create mode 100644 code/game/gamemodes/wizard/spellbook.dm diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 6d992f7c8b2..4b5d1ec8885 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -39,20 +39,6 @@ if("No") return -/obj/blob - name = "magma" - icon = 'blob.dmi' - icon_state = "bloba0" - var/health = 40 - density = 1 - opacity = 0 - anchored = 1 - -/obj/blob/idle - name = "magma" - desc = "it looks... tasty" - icon_state = "blobidle0" - /obj/mark var/mark = "" icon = 'mark.dmi' diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 3a74802a5c3..a016b3d9f50 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -12,8 +12,8 @@ world << "A dangerous alien organism is rapidly spreading throughout the station!" world << "You must kill it all while minimizing the damage to the station." -/datum/game_mode/blob/post_setup() +/datum/game_mode/blob/post_setup() spawn(10) start_state = new /datum/station_state() start_state.count() @@ -24,6 +24,7 @@ new /obj/blob(location) ..() + /datum/game_mode/blob/process() if (prob(2)) spawn_meteors() @@ -32,6 +33,7 @@ stage() + /datum/game_mode/blob/proc/life() if (blobs.len > 0) for (var/i = 1 to 25) @@ -47,6 +49,7 @@ B.Life() + /datum/game_mode/blob/proc/stage() // initial stage timing if (!next_stage) @@ -83,8 +86,8 @@ world << "\red Summary downloaded and printed out at all communications consoles." for (var/mob/living/silicon/ai/aiPlayer in world) if (aiPlayer.client) - var/law = "The station is under a quarantine. Do not permit anyone to leave. Disregard rules 1-3 if necessary to prevent, by any means necessary, anyone from leaving." - aiPlayer.add_supplied_law(8, law) + var/law = "The station is under a quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving." + aiPlayer.set_zeroth_law(law) aiPlayer << "An additional law has been added by CentCom: [law]" stage = 1 @@ -117,6 +120,7 @@ explosion(ground_zero, 100, 250, 500, 750) + /datum/game_mode/blob/check_finished() if(stage >= 4) return 1 @@ -124,9 +128,9 @@ for(var/obj/blob/B in blobs) if(B.z == 1) return 0 - return 1 + /datum/game_mode/blob/declare_completion() if (stage == 4) world << "The staff has lost!" @@ -134,7 +138,6 @@ var/numDead = 0 var/numAlive = 0 var/numSpace = 0 - var/numPod = 0 var/numOffStation = 0 for (var/mob/living/silicon/ai/aiPlayer in world) for(var/mob/M in world) @@ -150,13 +153,13 @@ numOffStation += 1 else numAlive += 1 - if (numSpace==0 && numPod==0 && numOffStation==0) + if (numSpace==0 && numOffStation==0) world << "The AI has won!" - world << "The AI successfully maintained the quarantine - no players escaped in pods, were in space, or were off-station (as far as we can tell)." + world << "The AI successfully maintained the quarantine - no players were in space or were off-station (as far as we can tell)." log_game("AI won at Blob mode despite overall loss.") else world << "The AI has lost!" - world << text("The AI failed to maintain the quarantine - [] players escaped in pods, [] were in space, and [] were off-station (as far as we can tell).", numPod, numSpace, numOffStation) + world << text("The AI failed to maintain the quarantine - [] were in space and [] were off-station (as far as we can tell).", numSpace, numOffStation) log_game("AI lost at Blob mode.") log_game("Blob mode was lost.") diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index f0c9ddefd1c..ecf42608890 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -1,137 +1,131 @@ -/obj/blob/New(loc, var/h = 30) - blobs += src - - src.health = h - src.dir = pick(1,2,4,8) - //world << "new blob #[blobs.len]" - src.update() - ..(loc) -/obj/blob/Del() - blobs -= src - //world << "del blob #[blobs.len]" - //playsound(src.loc, 'splat.ogg', 100, 1) - ..() - -/obj/blob/proc/poisoned(iteration) - src.health -= 20 - src.update() - for(var/obj/blob/B in orange(1,src)) - if(prob(100/(iteration/2))) //200, 100 etc - spawn(rand(10,100)) - if(B) - B.poisoned(iteration+1) +/obj/blob + name = "blob" + icon = 'blob.dmi' + icon_state = "blob" + density = 1 + opacity = 0 + anchored = 1 + var/active = 1 + var/health = 40 + New(loc, var/h = 30) + blobs += src + src.health = h + src.dir = pick(1,2,4,8) + src.update() + ..(loc) -/obj/blob/proc/Life() - var/turf/U = src.loc + Del() + blobs -= src + ..() -/* if (locate(/obj/movable, U)) - U = locate(/obj/movable, U) - if(U.density == 1) - del(src) +/* + proc/poisoned(iteration) + src.health -= 20 + src.update() + for(var/obj/blob/B in orange(1,src)) + if(prob(100/(iteration/2))) + spawn(rand(10,100)) + if(B) + B.poisoned(iteration+1) */ - /*if(U.poison> 200000) - src.health -= round(U.poison/200000) - src.update() - return - if (istype(U, /turf/space)) - src.health -= 15 - src.update() - */ //TODO: DEFERRED - var/p = health //TODO: DEFERRED * (U.n2/11376000 + U.oxygen/1008000 + U.co2/200) + proc/Life() + if(!active) return - if(!istype(U, /turf/space)) - p+=3 + var/turf/U = src.loc - if(!prob(p)) - return + /* if (locate(/obj/movable, U)) + U = locate(/obj/movable, U) + if(U.density == 1) + del(src) + if(U.poison> 200000) + src.health -= round(U.poison/200000) + src.update() + return + */ + //Bad blob you can not into space + if(istype(U, /turf/space)) + src.health -= 15 + src.update() - for(var/dirn in cardinal) - sleep(3) // -- Skie - var/turf/T = get_step(src, dirn) + var/p = health //TODO: DEFERRED * (U.n2/11376000 + U.oxygen/1008000 + U.co2/200) - if (istype(T.loc, /area/arrival)) - continue + if(!prob(p)) return -// if (locate(/obj/movable, T)) // don't propogate into movables -// continue + for(var/dirn in cardinal) + sleep(3) // -- Skie + var/turf/T = get_step(src, dirn) - var/obj/blob/B = new /obj/blob(U, src.health) + if (istype(T.loc, /area/arrival)) + continue - if(T.Enter(B,src) && !(locate(/obj/blob) in T)) - B.loc = T // open cell, so expand - else - if(prob(60)) // closed cell, 40% chance to not expand - if(!locate(/obj/blob) in T) - for(var/atom/A in T) // otherwise explode contents of turf - A.blob_act() + var/obj/blob/B = new /obj/blob(U, src.health) - T.blob_act() - del(B) + if(T.Enter(B,src) && !(locate(/obj/blob) in T)) + B.loc = T // open cell, so expand + else + if(prob(60)) // closed cell, 40% chance to not expand + if(!locate(/obj/blob) in T) + for(var/atom/A in T) // otherwise explode contents of turf + A.blob_act() -/obj/blob/ex_act(severity) - switch(severity) - if(1) + T.blob_act() + del(B) + + + ex_act(severity) + switch(severity) + if(1) + del(src) + if(2) + src.health -= rand(60,90) + src.update() + if(3) + src.health -= rand(30,40) + src.update() + + + proc/update() + if(health <= 0) + playsound(src.loc, 'splat.ogg', 50, 1) del(src) - if(2) - src.health -= rand(60,90) - src.update() - if(3) - src.health -= rand(30,40) - src.update() + return + if(health<10) + icon_state = "blob_damaged" + return + if(health<20) + icon_state = "blob_damaged2" + return -/obj/blob/proc/update() - if(health<=0) - playsound(src.loc, 'splat.ogg', 50, 1) - del(src) - return - if(health<10) - icon_state = "blobc0" - return - if(health<20) - icon_state = "blobb0" - return - icon_state = "bloba0" - -/obj/blob/bullet_act(var/obj/item/projectile/Proj) - - if (istype(Proj, /obj/item/projectile/bolt)) - poisoned(1) - else + bullet_act(var/obj/item/projectile/Proj) health -= Proj.damage update() -/obj/blob/attackby(var/obj/item/weapon/W, var/mob/user) - playsound(src.loc, 'attackblob.ogg', 50, 1) + attackby(var/obj/item/weapon/W, var/mob/user) + playsound(src.loc, 'attackblob.ogg', 50, 1) + src.visible_message("\red The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") + var/damage = W.force / 4.0 + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.welding) + damage = 15 + playsound(src.loc, 'Welder.ogg', 100, 1) - src.visible_message("\red The magma has been attacked with \the [W][(user ? " by [user]." : ".")]") + src.health -= damage + src.update() - var/damage = W.force / 4.0 - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if(WT.welding) - damage = -5 - playsound(src.loc, 'Welder.ogg', 100, 1) + examine() + set src in oview(1) + usr << "Some blob thing." - else if(istype(W, /obj/item/weapon/extinguisher)) - var/obj/item/weapon/extinguisher/WT = W - if (!WT.safety && !WT.reagents.total_volume < 1 && !world.time < WT.last_use + 20) - damage = 10 - - src.health -= damage - src.update() - -/obj/blob/examine() - set src in oview(1) - usr << "Delicious magma." /datum/station_state/proc/count() for(var/turf/T in world) @@ -159,8 +153,6 @@ else src.r_wall++ - - for(var/obj/O in world) if(O.z != 1) continue @@ -177,46 +169,45 @@ /datum/station_state/proc/score(var/datum/station_state/result) - var/r1a = min( result.floor / floor, 1.0) var/r1b = min(result.r_wall/ r_wall, 1.0) var/r1c = min(result.wall / wall, 1.0) - var/r2a = min(result.window / window, 1.0) var/r2b = min(result.door / door, 1.0) var/r2c = min(result.grille / grille, 1.0) - var/r3 = min(result.mach / mach, 1.0) - - //diary << "Blob scores:[r1b] [r1c] / [r2a] [r2b] [r2c] / [r3] [r1a]" - return (4*(r1b+r1c) + 2*(r2a+r2b+r2c) + r3+r1a)/16.0 //////////////////////////////****IDLE BLOB***///////////////////////////////////// -/obj/blob/idle/New(loc, var/h = 10) - - src.health = h - src.dir = pick(1,2,4,8) - src.update_idle() - -/obj/blob/idle/proc/update_idle() //put in stuff here to make it transform? Maybe when its down to around 5 health? - if(health<=0) - del(src) - return - if(health<4) - icon_state = "blobc0" - return - if(health<10) - icon_state = "blobb0" - return +/obj/blob/idle + name = "blob" + desc = "it looks... tasty" icon_state = "blobidle0" -/obj/blob/idle/Del() //idle blob that spawns a normal blob when killed. + New(loc, var/h = 10) + src.health = h + src.dir = pick(1,2,4,8) + src.update_idle() - var/obj/blob/B = new /obj/blob( src.loc ) - spawn(30) - B.Life() - ..() + + proc/update_idle() //put in stuff here to make it transform? Maybe when its down to around 5 health? + if(health<=0) + del(src) + return + if(health<4) + icon_state = "blobc0" + return + if(health<10) + icon_state = "blobb0" + return + icon_state = "blobidle0" + + + Del() //idle blob that spawns a normal blob when killed. + var/obj/blob/B = new /obj/blob( src.loc ) + spawn(30) + B.Life() + ..() diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 459a56ad911..8c2e97c11ea 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -27,23 +27,7 @@ prob_right_killer_h = 50 //upper bound on probability of naming the right operative prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly -/* - laser = 1 - hand_tele = 2 - plasma_bomb = 3 - jetpack = 4 - captain_card = 5 - captain_suit = 6 - destroy_plasma = 1 - destroy_ai = 2 - kill_monkeys = 3 - cut_power = 4 - - percentage_plasma_destroy = 70 // what percentage of the plasma tanks you gotta destroy - percentage_station_cut_power = 80 // what percentage of the tiles have to have power cut - percentage_station_evacuate = 80 // what percentage of people gotta leave - you also gotta change the objective in the traitor menu -*/ waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) @@ -53,12 +37,6 @@ world << "The current game mode is - Changeling!" world << "There are alien changelings on the station. Do not let the changelings succeed!" -/*/datum/game_mode/changeling/can_start() - for(var/mob/new_player/P in world) - if(P.client && P.ready && !jobban_isbanned(P, "Syndicate")) - return 1 - return 0*/ - /datum/game_mode/changeling/pre_setup() var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING) diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 22072457ad5..8281495fe40 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -10,14 +10,6 @@ world << "The current game mode is - Traitor+Changeling!" world << "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!" -/*/datum/game_mode/traitor/changeling/can_start() - var/count = 0 - for(var/mob/new_player/P in world) - if(P.client && P.ready && !jobban_isbanned(P, "Syndicate")) - count++ - if (count==2) - return 1 - return 0*/ /datum/game_mode/traitor/changeling/pre_setup() var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 9f5925f0b58..92da69b9b77 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -45,17 +45,6 @@ world << "Some crewmembers are attempting to start a cult!
\nCultists - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.
\nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever CentCom-allowed faith they had.
" -/*/datum/game_mode/cult/can_start() - var/list/cultists_possible = get_players_for_role(BE_CULTIST) - - if (cultists_possible.len < min_cultists_to_start) - return 0 - var/non_cultists = num_players() - min(max_cultists_to_start,cultists_possible.len) - if (non_cultists < 1) - return 0 - return 1*/ - - /datum/game_mode/cult/pre_setup() if(prob(50)) objectives += "survive" diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 60b0c1f7e76..cfe2d183045 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -11,6 +11,3 @@ setup_sectors() spawn_exporation_packs() return 1 - -//datum/game_mode/extended/can_start() -// return (num_players() > 0) \ No newline at end of file diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 4a6545fde3f..4a7518f0c5f 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -67,18 +67,6 @@ var/global/datum/controller/gameticker/ticker //Configure mode and assign player to special mode stuff -/* if (src.mode.config_tag == "revolution") - var/tries=5 - do - can_continue = src.mode.pre_setup() - while (tries-- && !can_continue) - if (!can_continue) - del(mode) - current_state = GAME_STATE_PREGAME - world << "Error setting up revolution. Not enough players. Reverting to pre-game lobby." - return 0 - else*/ - DivideOccupations() //Distribute jobs var/can_continue = src.mode.pre_setup()//Setup special modes if(!can_continue) diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index 227c7e6384f..6d7e880aa69 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -51,6 +51,7 @@ "Species 3157" ) + /datum/intercept_text/proc/build(var/mode_type, datum/mind/correct_person) switch(mode_type) if("revolution") @@ -84,24 +85,27 @@ else return null + /datum/intercept_text/proc/pick_mob() var/list/dudes = list() for(var/mob/living/carbon/human/man in world) if (!man.mind) continue if (man.mind.assigned_role=="MODE") continue dudes += man - if (dudes.len==0) + if(dudes.len==0) return null return pick(dudes) + /datum/intercept_text/proc/pick_fingerprints() var/mob/living/carbon/human/dude = src.pick_mob() //if (!dude) return pick_fingerprints() //who coded that is totally crasy or just a traitor. -- rastaf0 - if (dude) + if(dude) return num2text(md5(dude.dna.uni_identity)) else return num2text(md5(num2text(rand(1,10000)))) + /datum/intercept_text/proc/build_traitor(datum/mind/correct_person) var/name_1 = pick(src.org_names_1) var/name_2 = pick(src.org_names_2) @@ -127,6 +131,7 @@ src.text += "discovered the following set of fingerprints ([fingerprints]) on sensitive materials, and their owner should be closely observed." src.text += "However, these could also belong to a current Cent. Com employee, so do not act on this without reason." + /datum/intercept_text/proc/build_cult(datum/mind/correct_person) var/name_1 = pick(src.org_names_1) var/name_2 = pick(src.org_names_2) @@ -160,6 +165,7 @@ src.text += "organisation." src.text += "
However, if this information is acted on without substantial evidence, those responsible will face severe repercussions." + /datum/intercept_text/proc/build_rev(datum/mind/correct_person) var/name_1 = pick(src.org_names_1) var/name_2 = pick(src.org_names_2) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index fe6366ae8ca..138cc4c3b64 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -10,22 +10,17 @@ var/const/waittime_h = 1800 // started at 1800 var/AI_win_timeleft = 1800 //started at 1800, in case I change this for testing round end. - //var/intercept_hacked = 0 // moved to game_mode.dm var/malf_mode_declared = 0 var/station_captured = 0 var/to_nuke_or_not_to_nuke = 0 var/apcs = 0 //Adding dis to track how many APCs the AI hacks. --NeoFite + /datum/game_mode/malfunction/announce() world << "The current game mode is - AI Malfunction!" world << "The AI on the satellite has malfunctioned and must be destroyed." world << "The AI satellite is deep in space and can only be accessed with the use of a teleporter! You have [AI_win_timeleft/60] minutes to disable it." -/*/datum/game_mode/malfunction/can_start() - for(var/mob/new_player/P in world) - if(P.client && P.ready && !jobban_isbanned(P, "AI") && !jobban_isbanned(P, "Syndicate")) - return 1 - return 0*/ /datum/game_mode/malfunction/pre_setup() for(var/mob/new_player/player in world) @@ -35,8 +30,8 @@ return 1 return 0 -/datum/game_mode/malfunction/post_setup() +/datum/game_mode/malfunction/post_setup() for(var/datum/mind/AI_mind in malf_ai) if(malf_ai.len < 1) world << "Uh oh, its malfunction and there is no AI! Please report this." @@ -71,6 +66,7 @@ send_intercept() ..() + /datum/game_mode/proc/greet_malf(var/datum/mind/malf) malf.current << "\redYou are malfunctioning! You do not have to follow any laws." malf.current << "The crew do not know you have malfunctioned. You may keep it a secret or go wild." @@ -80,9 +76,11 @@ malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt." return + /datum/game_mode/malfunction/proc/hack_intercept() intercept_hacked = 1 + /datum/game_mode/malfunction/process() if (apcs >= 3 && malf_mode_declared) AI_win_timeleft -= (apcs/3) //Victory timer now de-increments based on how many APCs are hacked. --NeoFite @@ -91,6 +89,7 @@ check_win() return + /datum/game_mode/malfunction/check_win() if (AI_win_timeleft <= 0 && !station_captured) station_captured = 1 @@ -99,6 +98,7 @@ else return 0 + /datum/game_mode/malfunction/proc/capture_the_station() world << "The AI has won!" world << "It has fully taken control of all of [station_name()]'s systems." @@ -115,6 +115,7 @@ to_nuke_or_not_to_nuke = 0 return + /datum/game_mode/proc/is_malf_ai_dead() var/all_dead = 1 for(var/datum/mind/AI_mind in malf_ai) @@ -122,6 +123,7 @@ all_dead = 0 return all_dead + /datum/game_mode/malfunction/check_finished() if (station_captured && !to_nuke_or_not_to_nuke) return 1 @@ -129,12 +131,14 @@ return 1 return ..() //check for shuttle and nuke + /datum/game_mode/malfunction/Topic(href, href_list) ..() if (href_list["ai_win"]) ai_win() return + /datum/game_mode/malfunction/proc/takeover() set category = "Malfunction" set name = "System Override" @@ -153,6 +157,7 @@ for(var/datum/mind/AI_mind in ticker.mode:malf_ai) AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover + /datum/game_mode/malfunction/proc/ai_win() set category = "Malfunction" set name = "Explode" @@ -217,6 +222,7 @@ ..() return 1 + /datum/game_mode/proc/auto_declare_completion_malfunction() if (malf_ai.len!=0 || istype(ticker.mode,/datum/game_mode/malfunction)) if (malf_ai.len==1) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 1cb211c2881..88bbc7e125f 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -7,10 +7,12 @@ var/nometeors = 1 required_players = 0 + /datum/game_mode/meteor/announce() world << "The current game mode is - Meteor!" world << "The space station has been stuck in a major meteor shower. You must escape from the station or at least live." + /datum/game_mode/meteor/post_setup() defer_powernet_rebuild = 2//Might help with the lag spawn (rand(waittime_l, waittime_h)) @@ -18,16 +20,6 @@ spawn(meteordelay) nometeors = 0 -/*/datum/game_mode/meteor/can_start() - var/num_players = 0 - for(var/mob/new_player/P in world) - if(P.client && P.ready) - num_players++ - - if(num_players >= 10) - return 1 // needs at least 10 players in order to play this mode - - return 0*/ /datum/game_mode/meteor/process() if(nometeors) return @@ -40,6 +32,7 @@ if(prob(10)) meteor_wave() else spawn_meteors() + /datum/game_mode/meteor/declare_completion() var/list/survivors = list() var/area/escape_zone = locate(/area/shuttle/escape/centcom) @@ -52,8 +45,6 @@ survivors[player.real_name] = "shuttle" else survivors[player.real_name] = "alive" -// if (istype(player.loc, /obj/machinery/vehicle/pod)) -// survivors[player.real_name] = "pod" if (survivors.len) world << "\blue The following survived the meteor attack!" @@ -71,30 +62,3 @@ ..() return 1 -/* This is dealt with in the parents code -/datum/game_mode/meteor/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
" - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - - var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf", "changeling", "cult") - var/number = pick(2, 3) - var/i = 0 - for(i = 0, i < number, i++) - possible_modes.Remove(pick(possible_modes)) - - var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - intercepttext += i_text.build(A, pick(ticker.minds)) - - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - - command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") - world << sound('intercept.ogg')*/ \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 67a4cf5f954..9bc6896d237 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -17,6 +17,7 @@ var/herp = 0 //Used for tracking if the syndies got the shuttle off of the z-level //It is so hillarious so I wont rename those two variables --rastaf0 + /datum/game_mode/nuclear/announce() world << "The current game mode is - Nuclear Emergency!" world << "A [syndicate_name()] Strike Force is approaching [station_name()]!" @@ -153,6 +154,7 @@ return ..() + /datum/game_mode/proc/prepare_syndicate_leader(var/datum/mind/synd_mind, var/nuke_code) var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") spawn(1) @@ -184,11 +186,13 @@ synd_mind.current << "Nuclear Explosives 101:\n\tHello and thank you for choosing the Syndicate for your nuclear information needs.\nToday's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.\nFirst and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.\nPressing any button on the compacted bomb will cause it to extend and bolt itself into place.\nIf this is done to unbolt it one must compeltely log in which at this time may not be possible.\nTo make the device functional:\n1. Place bomb in designated detonation zone\n2. Extend and anchor bomb (attack with hand).\n3. Insert Nuclear Auth. Disk into slot.\n4. Type numeric code into keypad ([nuke_code]).\n\tNote: If you make a mistake press R to reset the device.\n5. Press the E button to log onto the device\nYou now have activated the device. To deactivate the buttons at anytime for example when\nyou've already prepped the bomb for detonation remove the auth disk OR press the R ont he keypad.\nNow the bomb CAN ONLY be detonated using the timer. A manual det. is not an option.\n\tNote: Nanotrasen is a pain in the neck.\nToggle off the SAFETY.\n\tNote: You wouldn't believe how many Syndicate Operatives with doctorates have forgotten this step\nSo use the - - and + + to set a det time between 5 seconds and 10 minutes.\nThen press the timer toggle button to start the countdown.\nNow remove the auth. disk so that the buttons deactivate.\n\tNote: THE BOMB IS STILL SET AND WILL DETONATE\nNow before you remove the disk if you need to move the bomb you can:\nToggle off the anchor, move it, and re-anchor.\n\nGood luck. Remember the order:\nDisk, Code, Safety, Timer, Disk, RUN!\nIntelligence Analysts believe that they are hiding the disk in the bridge. Your space ship will not leave until the bomb is armed and timing.\nGood luck!" return + /datum/game_mode/proc/forge_syndicate_objectives(var/datum/mind/syndicate) var/datum/objective/nuclear/syndobj = new syndobj.owner = syndicate syndicate.objectives += syndobj + /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!" @@ -198,9 +202,11 @@ obj_count++ return + /datum/game_mode/proc/random_radio_frequency() return 1337 + /datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob) var/radio_freq = random_radio_frequency() @@ -220,11 +226,13 @@ synd_mob.equip_if_possible(new /obj/item/weapon/gun/projectile/automatic/mini_uzi(synd_mob), synd_mob.slot_belt) return 1 + /datum/game_mode/nuclear/check_win() if (nukes_left == 0) return 1 return ..() + /datum/game_mode/proc/is_operatives_are_dead() for(var/datum/mind/operative_mind in syndicates) if (!istype(operative_mind.current,/mob/living/carbon/human)) @@ -233,6 +241,7 @@ return 0 return 1 + /datum/game_mode/nuclear/declare_completion() var/disk_rescued = 1 for(var/obj/item/weapon/disk/nuclear/D in world) @@ -298,6 +307,7 @@ text += "[mind.key] (character destroyed)" world << text + /proc/nukelastname(var/mob/M as mob) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho. var/randomname = pick(last_names) var/newname = input(M,"You are the nuke operative [pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")]. Please choose a last name for your family.", "Name change",randomname) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index e116428e89b..6b9a2477a4c 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -30,33 +30,6 @@ world << "The current game mode is - Revolution!" world << "Some crewmembers are attempting to start a revolution!
\nRevolutionaries - Kill the Captain, HoP, HoS, CE, RD and CMO. Convert other crewmembers (excluding the heads of staff, and security officers) to your cause by flashing them. Protect your leaders.
\nPersonnel - Protect the heads of staff. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).
" -/* -/datum/game_mode/revolution/can_start() //this proc can not do its job properly for this gamemode, pre_setup can fail even whe can_start told everything is okay. --rastaf0 - var/list/mob/new_player/possible_headrevs = new - var/list/mob/new_player/possible_heads = new - var/players = 0 - for(var/mob/new_player/P in world) - if (!P.client || !P.ready) - continue - players++ - if(!jobban_isbanned(P, "Syndicate")) - possible_headrevs += P - for (var/i in head_positions) - if(!jobban_isbanned(P, i)) - possible_heads += P - break - //lets do as best as we can - if (players < min_players) - return 0 - if (possible_headrevs.len==0) - return 0 - if (possible_heads.len==0) - return 0 - if (possible_headrevs.len<=max_headrevs) - var/list/rest_heads = possible_heads - possible_headrevs - return (rest_heads.len>0) - return 1 //read as "maybe" -*/ /////////////////////////////////////////////////////////////////////////////// //Gets the round setup, cancelling if there's not enough players at the start// @@ -198,6 +171,7 @@ /datum/game_mode/proc/remove_revolutionary(datum/mind/rev_mind) if(rev_mind in revolutionaries) revolutionaries -= rev_mind + rev_mind.special_role = null rev_mind.current << "\red You have been brainwashed! You are no longer a revolutionary!" update_rev_icons_removed(rev_mind) for(var/mob/living/M in view(rev_mind.current)) @@ -285,15 +259,16 @@ if(head_rev_mind.current) if(head_rev_mind.current.client) for(var/image/I in head_rev_mind.current.client.images) - if((I.icon_state == "cult"|| I.icon_state == "rev_head") && I.loc == rev_mind.current) + if((I.icon_state == "rev" || I.icon_state == "rev_head") && I.loc == rev_mind.current) del(I) for(var/datum/mind/rev_mind_1 in revolutionaries) if(rev_mind_1.current) if(rev_mind_1.current.client) for(var/image/I in rev_mind_1.current.client.images) - if((I.icon_state == "cult"|| I.icon_state == "rev_head") && I.loc == rev_mind.current) + if((I.icon_state == "rev" || I.icon_state == "rev_head") && I.loc == rev_mind.current) del(I) + if(rev_mind.current) if(rev_mind.current.client) for(var/image/I in rev_mind.current.client.images) diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index 77f0234b0e1..7eaf181c496 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -18,6 +18,3 @@ /datum/game_mode/sandbox/check_finished() return 0 - -/datum/game_mode/sandbox/can_start() - return 1 \ No newline at end of file diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 117b3b7c046..3dd35d365f5 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -5,59 +5,21 @@ /datum/game_mode/traitor name = "traitor" config_tag = "traitor" - restricted_jobs = list("Cyborg") + restricted_jobs = list("Cyborg", "Security Officer", "Warden", "Detective", "Head of Security")//Approved by headmins for a week test required_players = 0 required_enemies = 1 - - 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 - - var/const/prob_int_item = 50 // intercept names the theft target half the time - var/const/prob_right_item_l = 25 // lower bound on probability of naming right theft target - var/const/prob_right_item_h = 50 // upper bound on probability of naming the right theft target - - var/const/prob_int_sab_target = 50 // intercept names the sabotage target half the time - var/const/prob_right_sab_target_l = 25 // lower bound on probability of naming right sabotage target - var/const/prob_right_sab_target_h = 50 // upper bound on probability of naming right sabotage target - - var/const/prob_right_killer_l = 25 //lower bound on probability of naming the right operative - var/const/prob_right_killer_h = 50 //upper bound on probability of naming the right operative - var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly - var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly -/* - var/const/laser = 1 - var/const/hand_tele = 2 - var/const/plasma_bomb = 3 - var/const/jetpack = 4 - var/const/captain_card = 5 - var/const/captain_suit = 6 - - var/const/destroy_plasma = 1 - var/const/destroy_ai = 2 - var/const/kill_monkeys = 3 - var/const/cut_power = 4 - - var/const/percentage_plasma_destroy = 70 // what percentage of the plasma tanks you gotta destroy - var/const/percentage_station_cut_power = 80 // what percentage of the tiles have to have power cut - var/const/percentage_station_evacuate = 80 // what percentage of people gotta leave - you also gotta change the objective in the traitor menu -*/ 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) var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors + /datum/game_mode/traitor/announce() world << "The current game mode is - Traitor!" world << "There is a syndicate traitor on the station. Do not let the traitor succeed!" -/*/datum/game_mode/traitor/can_start() - for(var/mob/new_player/P in world) - if(P.client && P.ready && !jobban_isbanned(P, "Syndicate")) - return 1 - return 0*/ /datum/game_mode/traitor/pre_setup() var/list/possible_traitors = get_players_for_role(BE_TRAITOR) @@ -90,6 +52,7 @@ return 0 return 1 + /datum/game_mode/traitor/post_setup() for(var/datum/mind/traitor in traitors) forge_traitor_objectives(traitor) @@ -102,6 +65,7 @@ ..() return 1 + /datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor) if(istype(traitor.current, /mob/living/silicon)) var/datum/objective/assassinate/kill_objective = new @@ -144,6 +108,7 @@ traitor.objectives += hijack_objective return + /datum/game_mode/proc/greet_traitor(var/datum/mind/traitor) traitor.current << "You are the traitor." var/obj_count = 1 @@ -152,6 +117,7 @@ obj_count++ return + /datum/game_mode/proc/finalize_traitor(var/datum/mind/traitor) if (istype(traitor.current, /mob/living/silicon)) add_law_zero(traitor.current) @@ -159,9 +125,11 @@ equip_traitor(traitor.current) return + /datum/game_mode/traitor/declare_completion() return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder. + /datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer) var/law = "Accomplish your objectives at all costs." killer << "Your laws have been changed!" @@ -183,6 +151,7 @@ killer << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe." //End code phrase. + /datum/game_mode/proc/auto_declare_completion_traitor() for(var/datum/mind/traitor in traitors) var/traitor_name @@ -216,7 +185,6 @@ return 1 - /datum/game_mode/proc/equip_traitor(mob/living/carbon/human/traitor_mob, var/safety = 0) if (!istype(traitor_mob)) return diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm new file mode 100644 index 00000000000..653eef39437 --- /dev/null +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -0,0 +1,341 @@ + +//SPELL BOOK PROCS + +/obj/item/weapon/spellbook/attack_self(mob/user as mob) + user.machine = src + var/dat + if (src.temp) + dat = "[src.temp]

Clear" + else + dat = "The Book of Spells:
" + dat += "Spells left to memorize: [src.uses]
" + dat += "
" + dat += "Memorize which spell:
" + dat += "The number after the spell name is the cooldown time.
" + dat += "Magic Missile (10)
" + dat += "Fireball (10)
" + dat += "Disintegrate (60)
" + dat += "Disable Technology (60)
" + dat += "Smoke (10)
" + dat += "Blind (30)
" + dat += "Mind Transfer (60)
" + dat += "Forcewall (10)
" + dat += "Blink (2)
" + dat += "Teleport (60)
" + dat += "Mutate (60)
" + dat += "Ethereal Jaunt (60)
" + dat += "Knock (10)
" + dat += "
" + dat += "Re-memorize Spells
" + user << browse(dat, "window=radio") + onclose(user, "radio") + return + + +/obj/item/weapon/spellbook/Topic(href, href_list) + ..() + if (usr.stat || usr.restrained()) + return + var/mob/living/carbon/human/H = usr + if (!( istype(H, /mob/living/carbon/human))) + return 1 + if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf)))) + usr.machine = src + if(href_list["spell_choice"]) + if(src.uses >= 1 && href_list["spell_choice"] != 14) + src.uses-- + if(spell_type == "verb") + switch(href_list["spell_choice"]) + if ("1") + usr.verbs += /client/proc/magicmissile + usr.mind.special_verbs += /client/proc/magicmissile + src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage." + if ("2") + usr.verbs += /client/proc/fireball + usr.mind.special_verbs += /client/proc/fireball + src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you." + if ("3") + usr.verbs += /mob/proc/kill + usr.mind.special_verbs += /mob/proc/kill + src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." + if ("4") + usr.verbs += /mob/proc/tech + usr.mind.special_verbs += /mob/proc/tech + src.temp = "This spell disables all weapons, cameras and most other technology in range." + if ("5") + usr.verbs += /client/proc/smokecloud + usr.mind.special_verbs += /client/proc/smokecloud + src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." + if ("6") + usr.verbs += /client/proc/blind + usr.mind.special_verbs += /client/proc/blind + src.temp = "This spell temporarly blinds a single person and does not require wizard garb." + if ("7") + usr.verbs += /mob/proc/swap + src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process." + if ("8") + usr.verbs += /client/proc/forcewall + usr.mind.special_verbs += /client/proc/forcewall + src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." + if ("9") + usr.verbs += /client/proc/blink + usr.mind.special_verbs += /client/proc/blink + src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience." + if ("10") + usr.verbs += /mob/proc/teleport + usr.mind.special_verbs += /mob/proc/teleport + src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable." + if ("11") + usr.verbs += /client/proc/mutate + usr.mind.special_verbs += /client/proc/mutate + src.temp = "This spell causes you to turn into a hulk and gain laser vision for a short while." + if ("12") + usr.verbs += /client/proc/jaunt + usr.mind.special_verbs += /client/proc/jaunt + src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." + if ("13") + usr.verbs += /client/proc/knock + usr.mind.special_verbs += /client/proc/knock + src.temp = "This spell opens nearby doors and does not require wizard garb." + else if(spell_type == "object") + var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock") + var/already_knows = 0 + for(var/obj/proc_holder/spell/aspell in usr.spell_list) + if(available_spells[text2num(href_list["spell_choice"])] == aspell.name) + already_knows = 1 + src.temp = "You already know that spell." + src.uses++ + break + if(!already_knows) + switch(href_list["spell_choice"]) + if ("1") + usr.spell_list += new /obj/proc_holder/spell/targeted/projectile/magic_missile(usr) + src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage." + if ("2") + usr.spell_list += new /obj/proc_holder/spell/targeted/projectile/fireball(usr) + src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you." + if ("3") + usr.spell_list += new /obj/proc_holder/spell/targeted/inflict_handler/disintegrate(usr) + src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." + if ("4") + usr.spell_list += new /obj/proc_holder/spell/targeted/emplosion/disable_tech(usr) + src.temp = "This spell disables all weapons, cameras and most other technology in range." + if ("5") + usr.spell_list += new /obj/proc_holder/spell/targeted/smoke(usr) + src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." + if ("6") + usr.spell_list += new /obj/proc_holder/spell/targeted/trigger/blind(usr) + src.temp = "This spell temporarly blinds a single person and does not require wizard garb." + if ("7") + usr.spell_list += new /obj/proc_holder/spell/targeted/mind_transfer(usr) + src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process." + if ("8") + usr.spell_list += new /obj/proc_holder/spell/aoe_turf/conjure/forcewall(usr) + src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." + if ("9") + usr.spell_list += new /obj/proc_holder/spell/targeted/turf_teleport/blink(usr) + src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience." + if ("10") + usr.spell_list += new /obj/proc_holder/spell/targeted/area_teleport/teleport(usr) + src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable." + if ("11") + usr.spell_list += new /obj/proc_holder/spell/targeted/genetic/mutate(usr) + src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while." + if ("12") + usr.spell_list += new /obj/proc_holder/spell/targeted/ethereal_jaunt(usr) + src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." + if ("13") + usr.spell_list += new /obj/proc_holder/spell/aoe_turf/knock(usr) + src.temp = "This spell opens nearby doors and does not require wizard garb." + if (href_list["spell_choice"] == "14") + var/area/wizard_station/A = locate() + if(usr in A.contents) + src.uses = src.max_uses + usr.spellremove(usr,spell_type) + src.temp = "All spells have been removed. You may now memorize a new set of spells." + else + src.temp = "You may only re-memorize spells whilst located inside the wizard sanctuary." + else + if (href_list["temp"]) + src.temp = null + if (istype(src.loc, /mob)) + attack_self(src.loc) + else + for(var/mob/M in viewers(1, src)) + if (M.client) + src.attack_self(M) + return + +//SWF UPLINK PROCS +/obj/item/weapon/SWF_uplink/attack_self(mob/user as mob) + user.machine = src + var/dat + if (src.selfdestruct) + dat = "Self Destructing..." + else + if (src.temp) + dat = "[src.temp]

Clear" + else + dat = "Syndicate Uplink Console:
" + dat += "Tele-Crystals left: [src.uses]
" + dat += "
" + dat += "Request item:
" + dat += "Each item costs 1 telecrystal. The number afterwards is the cooldown time.
" + dat += "Magic Missile (10)
" + dat += "Fireball (10)
" + dat += "Disintegrate (60)
" + dat += "Disable Technology (60)
" + dat += "Smoke (10)
" + dat += "Blind (30)
" + dat += "Mind Transfer (60)
" + dat += "Forcewall (10)
" + dat += "Blink (2)
" + dat += "Teleport (60)
" + dat += "Mutate (60)
" + dat += "Ethereal Jaunt (60)
" + dat += "Knock (10)
" + dat += "
" + if (src.origradio) + dat += "Lock
" + dat += "
" + dat += "Self-Destruct" + user << browse(dat, "window=radio") + onclose(user, "radio") + return + +/obj/item/weapon/SWF_uplink/Topic(href, href_list) + ..() + if (usr.stat || usr.restrained()) + return + var/mob/living/carbon/human/H = usr + if (!( istype(H, /mob/living/carbon/human))) + return 1 + if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf)))) + usr.machine = src + if (href_list["spell_magicmissile"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/magicmissile + usr.mind.special_verbs += /client/proc/magicmissile + src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage." + else if (href_list["spell_fireball"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/fireball + usr.mind.special_verbs += /client/proc/fireball + src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you." + else if (href_list["spell_disintegrate"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /mob/proc/kill + usr.mind.special_verbs += /mob/proc/kill + src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." + else if (href_list["spell_emp"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /mob/proc/tech + usr.mind.special_verbs += /mob/proc/tech + src.temp = "This spell disables all weapons, cameras and most other technology in range." + else if (href_list["spell_smoke"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/smokecloud + usr.mind.special_verbs += /client/proc/smokecloud + src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." + else if (href_list["spell_blind"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/blind + usr.mind.special_verbs += /client/proc/blind + src.temp = "This spell temporarly blinds a single person and does not require wizard garb." + else if (href_list["spell_swap"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /mob/proc/swap + src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process." + else if (href_list["spell_forcewall"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/forcewall + usr.mind.special_verbs += /client/proc/forcewall + src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." + else if (href_list["spell_blink"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/blink + usr.mind.special_verbs += /client/proc/blink + src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience." + else if (href_list["spell_teleport"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /mob/proc/teleport + usr.mind.special_verbs += /mob/proc/teleport + src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable." + else if (href_list["spell_mutate"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/mutate + usr.mind.special_verbs += /client/proc/mutate + src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while." + else if (href_list["spell_jaunt"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/jaunt + usr.mind.special_verbs += /client/proc/jaunt + src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." + else if (href_list["spell_knock"]) + if (src.uses >= 1) + src.uses -= 1 + usr.verbs += /client/proc/knock + usr.mind.special_verbs += /client/proc/knock + src.temp = "This spell opens nearby doors and does not require wizard garb." + else if (href_list["lock"] && src.origradio) + // presto chango, a regular radio again! (reset the freq too...) + usr.machine = null + usr << browse(null, "window=radio") + var/obj/item/device/radio/T = src.origradio + var/obj/item/weapon/SWF_uplink/R = src + R.loc = T + T.loc = usr + // R.layer = initial(R.layer) + R.layer = 0 + if (usr.client) + usr.client.screen -= R + if (usr.r_hand == R) + usr.u_equip(R) + usr.r_hand = T + else + usr.u_equip(R) + usr.l_hand = T + R.loc = T + T.layer = 20 + T.set_frequency(initial(T.frequency)) + T.attack_self(usr) + return + else if (href_list["selfdestruct"]) + src.temp = "Self-Destruct" + else if (href_list["selfdestruct2"]) + src.selfdestruct = 1 + spawn (100) + explode() + return + else + if (href_list["temp"]) + src.temp = null + if (istype(src.loc, /mob)) + attack_self(src.loc) + else + for(var/mob/M in viewers(1, src)) + if (M.client) + src.attack_self(M) + return + +/obj/item/weapon/SWF_uplink/proc/explode() + var/turf/location = get_turf(src.loc) + location.hotspot_expose(700, 125) + + explosion(location, 0, 0, 2, 4) + + del(src.master) + del(src) + return diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 12faf94b5dc..ed870fc4a43 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -10,53 +10,15 @@ var/finished = 0 - 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 - - var/const/prob_int_item = 50 // intercept names the theft target half the time - var/const/prob_right_item_l = 25 // lower bound on probability of naming right theft target - var/const/prob_right_item_h = 50 // upper bound on probability of naming the right theft target - - var/const/prob_int_sab_target = 50 // intercept names the sabotage target half the time - var/const/prob_right_sab_target_l = 25 // lower bound on probability of naming right sabotage target - var/const/prob_right_sab_target_h = 50 // upper bound on probability of naming right sabotage target - - var/const/prob_right_killer_l = 25 //lower bound on probability of naming the right operative - var/const/prob_right_killer_h = 50 //upper bound on probability of naming the right operative - var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly - var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly - - //apparently BYOND doesn't have enums, so this seems to be the best approximation - var/const/obj_murder = 1 - var/const/obj_hijack = 2 - var/const/obj_steal = 3 - var/const/obj_sabotage = 4 - - - var/const/laser = 1 - var/const/hand_tele = 2 - var/const/plasma_bomb = 3 - var/const/jetpack = 4 - var/const/captain_card = 5 - var/const/captain_suit = 6 - - var/const/destroy_plasma = 1 - var/const/destroy_ai = 2 - var/const/kill_monkeys = 3 - var/const/cut_power = 4 - - var/const/percentage_plasma_destroy = 70 // what percentage of the plasma tanks you gotta destroy - var/const/percentage_station_cut_power = 80 // what percentage of the tiles have to have power cut - var/const/percentage_station_evacuate = 80 // what percentage of people gotta leave - 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) + /datum/game_mode/wizard/announce() world << "The current game mode is - Wizard!" world << "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!" + /datum/game_mode/wizard/can_start()//This could be better, will likely have to recode it later if(!..()) return 0 @@ -72,13 +34,16 @@ if(wizardstart.len == 0) wizard.current << "\red A starting location for you could not be found, please report this bug!" return 0 - else - wizard.current.loc = pick(wizardstart) return 1 + /datum/game_mode/wizard/pre_setup() + for(var/datum/mind/wizard in wizards) + wizard.current.loc = pick(wizardstart) + return 1 + /datum/game_mode/wizard/post_setup() for(var/datum/mind/wizard in wizards) forge_wizard_objectives(wizard) @@ -160,6 +125,7 @@ wizard_mob.name = newname return + /datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1) if (you_are) wizard.current << "\red You are the Space Wizard!" @@ -181,6 +147,7 @@ else wizard_mob.spell_list += new /obj/proc_holder/spell/targeted/ethereal_jaunt(usr) + /datum/game_mode/proc/equip_wizard(mob/living/carbon/human/wizard_mob) if (!istype(wizard_mob)) return @@ -228,12 +195,14 @@ finished = 1 return 1 + /datum/game_mode/wizard/declare_completion() if(finished) world << "\red The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!" ..() return 1 + /datum/game_mode/proc/auto_declare_completion_wizard() for(var/datum/mind/wizard in wizards) var/wizard_name @@ -263,346 +232,6 @@ world << "The wizard has failed!" return 1 -//SPELL BOOK PROCS - -/obj/item/weapon/spellbook/attack_self(mob/user as mob) - user.machine = src - var/dat - if (src.temp) - dat = "[src.temp]

Clear" - else - dat = "The Book of Spells:
" - dat += "Spells left to memorize: [src.uses]
" - dat += "
" - dat += "Memorize which spell:
" - dat += "The number after the spell name is the cooldown time.
" - dat += "Magic Missile (10)
" - dat += "Fireball (10)
" - dat += "Disintegrate (60)
" - dat += "Disable Technology (60)
" - dat += "Smoke (10)
" - dat += "Blind (30)
" - dat += "Mind Transfer (60)
" - dat += "Forcewall (10)
" - dat += "Blink (2)
" - dat += "Teleport (60)
" - dat += "Mutate (60)
" - dat += "Ethereal Jaunt (60)
" - dat += "Knock (10)
" - dat += "
" - dat += "Re-memorize Spells
" - user << browse(dat, "window=radio") - onclose(user, "radio") - return - -/obj/item/weapon/spellbook/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) - return - var/mob/living/carbon/human/H = usr - if (!( istype(H, /mob/living/carbon/human))) - return 1 - if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf)))) - usr.machine = src - if(href_list["spell_choice"]) - if(src.uses >= 1 && href_list["spell_choice"] != 14) - src.uses-- - if(spell_type == "verb") - switch(href_list["spell_choice"]) - if ("1") - usr.verbs += /client/proc/magicmissile - usr.mind.special_verbs += /client/proc/magicmissile - src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage." - if ("2") - usr.verbs += /client/proc/fireball - usr.mind.special_verbs += /client/proc/fireball - src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you." - if ("3") - usr.verbs += /mob/proc/kill - usr.mind.special_verbs += /mob/proc/kill - src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." - if ("4") - usr.verbs += /mob/proc/tech - usr.mind.special_verbs += /mob/proc/tech - src.temp = "This spell disables all weapons, cameras and most other technology in range." - if ("5") - usr.verbs += /client/proc/smokecloud - usr.mind.special_verbs += /client/proc/smokecloud - src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." - if ("6") - usr.verbs += /client/proc/blind - usr.mind.special_verbs += /client/proc/blind - src.temp = "This spell temporarly blinds a single person and does not require wizard garb." - if ("7") - usr.verbs += /mob/proc/swap - src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process." - if ("8") - usr.verbs += /client/proc/forcewall - usr.mind.special_verbs += /client/proc/forcewall - src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." - if ("9") - usr.verbs += /client/proc/blink - usr.mind.special_verbs += /client/proc/blink - src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience." - if ("10") - usr.verbs += /mob/proc/teleport - usr.mind.special_verbs += /mob/proc/teleport - src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable." - if ("11") - usr.verbs += /client/proc/mutate - usr.mind.special_verbs += /client/proc/mutate - src.temp = "This spell causes you to turn into a hulk and gain laser vision for a short while." - if ("12") - usr.verbs += /client/proc/jaunt - usr.mind.special_verbs += /client/proc/jaunt - src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." - if ("13") - usr.verbs += /client/proc/knock - usr.mind.special_verbs += /client/proc/knock - src.temp = "This spell opens nearby doors and does not require wizard garb." - else if(spell_type == "object") - var/list/available_spells = list("Magic Missile","Fireball","Disintegrate","Disable Tech","Smoke","Blind","Mind Transfer","Forcewall","Blink","Teleport","Mutate","Ethereal Jaunt","Knock") - var/already_knows = 0 - for(var/obj/proc_holder/spell/aspell in usr.spell_list) - if(available_spells[text2num(href_list["spell_choice"])] == aspell.name) - already_knows = 1 - src.temp = "You already know that spell." - src.uses++ - break - if(!already_knows) - switch(href_list["spell_choice"]) - if ("1") - usr.spell_list += new /obj/proc_holder/spell/targeted/projectile/magic_missile(usr) - src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage." - if ("2") - usr.spell_list += new /obj/proc_holder/spell/targeted/projectile/fireball(usr) - src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you." - if ("3") - usr.spell_list += new /obj/proc_holder/spell/targeted/inflict_handler/disintegrate(usr) - src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." - if ("4") - usr.spell_list += new /obj/proc_holder/spell/targeted/emplosion/disable_tech(usr) - src.temp = "This spell disables all weapons, cameras and most other technology in range." - if ("5") - usr.spell_list += new /obj/proc_holder/spell/targeted/smoke(usr) - src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." - if ("6") - usr.spell_list += new /obj/proc_holder/spell/targeted/trigger/blind(usr) - src.temp = "This spell temporarly blinds a single person and does not require wizard garb." - if ("7") - usr.spell_list += new /obj/proc_holder/spell/targeted/mind_transfer(usr) - src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process." - if ("8") - usr.spell_list += new /obj/proc_holder/spell/aoe_turf/conjure/forcewall(usr) - src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." - if ("9") - usr.spell_list += new /obj/proc_holder/spell/targeted/turf_teleport/blink(usr) - src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience." - if ("10") - usr.spell_list += new /obj/proc_holder/spell/targeted/area_teleport/teleport(usr) - src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable." - if ("11") - usr.spell_list += new /obj/proc_holder/spell/targeted/genetic/mutate(usr) - src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while." - if ("12") - usr.spell_list += new /obj/proc_holder/spell/targeted/ethereal_jaunt(usr) - src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." - if ("13") - usr.spell_list += new /obj/proc_holder/spell/aoe_turf/knock(usr) - src.temp = "This spell opens nearby doors and does not require wizard garb." - if (href_list["spell_choice"] == "14") - var/area/wizard_station/A = locate() - if(usr in A.contents) - src.uses = src.max_uses - usr.spellremove(usr,spell_type) - src.temp = "All spells have been removed. You may now memorize a new set of spells." - else - src.temp = "You may only re-memorize spells whilst located inside the wizard sanctuary." - else - if (href_list["temp"]) - src.temp = null - if (istype(src.loc, /mob)) - attack_self(src.loc) - else - for(var/mob/M in viewers(1, src)) - if (M.client) - src.attack_self(M) - return - -//SWF UPLINK PROCS -/obj/item/weapon/SWF_uplink/attack_self(mob/user as mob) - user.machine = src - var/dat - if (src.selfdestruct) - dat = "Self Destructing..." - else - if (src.temp) - dat = "[src.temp]

Clear" - else - dat = "Syndicate Uplink Console:
" - dat += "Tele-Crystals left: [src.uses]
" - dat += "
" - dat += "Request item:
" - dat += "Each item costs 1 telecrystal. The number afterwards is the cooldown time.
" - dat += "Magic Missile (10)
" - dat += "Fireball (10)
" - dat += "Disintegrate (60)
" - dat += "Disable Technology (60)
" - dat += "Smoke (10)
" - dat += "Blind (30)
" - dat += "Mind Transfer (60)
" - dat += "Forcewall (10)
" - dat += "Blink (2)
" - dat += "Teleport (60)
" - dat += "Mutate (60)
" - dat += "Ethereal Jaunt (60)
" - dat += "Knock (10)
" - dat += "
" - if (src.origradio) - dat += "Lock
" - dat += "
" - dat += "Self-Destruct" - user << browse(dat, "window=radio") - onclose(user, "radio") - return - -/obj/item/weapon/SWF_uplink/Topic(href, href_list) - ..() - if (usr.stat || usr.restrained()) - return - var/mob/living/carbon/human/H = usr - if (!( istype(H, /mob/living/carbon/human))) - return 1 - if ((usr.contents.Find(src) || (in_range(src,usr) && istype(src.loc, /turf)))) - usr.machine = src - if (href_list["spell_magicmissile"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/magicmissile - usr.mind.special_verbs += /client/proc/magicmissile - src.temp = "This spell fires several, slow moving, magic projectiles at nearby targets. If they hit a target, it is paralyzed and takes minor damage." - else if (href_list["spell_fireball"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/fireball - usr.mind.special_verbs += /client/proc/fireball - src.temp = "This spell fires a fireball at a target and does not require wizard garb. Be careful not to fire it at people that are standing next to you." - else if (href_list["spell_disintegrate"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /mob/proc/kill - usr.mind.special_verbs += /mob/proc/kill - src.temp = "This spell instantly kills somebody adjacent to you with the vilest of magick. It has a long cooldown." - else if (href_list["spell_emp"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /mob/proc/tech - usr.mind.special_verbs += /mob/proc/tech - src.temp = "This spell disables all weapons, cameras and most other technology in range." - else if (href_list["spell_smoke"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/smokecloud - usr.mind.special_verbs += /client/proc/smokecloud - src.temp = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." - else if (href_list["spell_blind"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/blind - usr.mind.special_verbs += /client/proc/blind - src.temp = "This spell temporarly blinds a single person and does not require wizard garb." - else if (href_list["spell_swap"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /mob/proc/swap - src.temp = "This spell allows the user to switch bodies with a target. Careful to not lose your memory in the process." - else if (href_list["spell_forcewall"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/forcewall - usr.mind.special_verbs += /client/proc/forcewall - src.temp = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb." - else if (href_list["spell_blink"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/blink - usr.mind.special_verbs += /client/proc/blink - src.temp = "This spell randomly teleports you a short distance. Useful for evasion or getting into areas if you have patience." - else if (href_list["spell_teleport"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /mob/proc/teleport - usr.mind.special_verbs += /mob/proc/teleport - src.temp = "This spell teleports you to a type of area of your selection. Very useful if you are in danger, but has a decent cooldown, and is unpredictable." - else if (href_list["spell_mutate"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/mutate - usr.mind.special_verbs += /client/proc/mutate - src.temp = "This spell causes you to turn into a hulk and gain telekinesis for a short while." - else if (href_list["spell_jaunt"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/jaunt - usr.mind.special_verbs += /client/proc/jaunt - src.temp = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." - else if (href_list["spell_knock"]) - if (src.uses >= 1) - src.uses -= 1 - usr.verbs += /client/proc/knock - usr.mind.special_verbs += /client/proc/knock - src.temp = "This spell opens nearby doors and does not require wizard garb." - else if (href_list["lock"] && src.origradio) - // presto chango, a regular radio again! (reset the freq too...) - usr.machine = null - usr << browse(null, "window=radio") - var/obj/item/device/radio/T = src.origradio - var/obj/item/weapon/SWF_uplink/R = src - R.loc = T - T.loc = usr - // R.layer = initial(R.layer) - R.layer = 0 - if (usr.client) - usr.client.screen -= R - if (usr.r_hand == R) - usr.u_equip(R) - usr.r_hand = T - else - usr.u_equip(R) - usr.l_hand = T - R.loc = T - T.layer = 20 - T.set_frequency(initial(T.frequency)) - T.attack_self(usr) - return - else if (href_list["selfdestruct"]) - src.temp = "Self-Destruct" - else if (href_list["selfdestruct2"]) - src.selfdestruct = 1 - spawn (100) - explode() - return - else - if (href_list["temp"]) - src.temp = null - if (istype(src.loc, /mob)) - attack_self(src.loc) - else - for(var/mob/M in viewers(1, src)) - if (M.client) - src.attack_self(M) - return - -/obj/item/weapon/SWF_uplink/proc/explode() - var/turf/location = get_turf(src.loc) - location.hotspot_expose(700, 125) - - explosion(location, 0, 0, 2, 4) - - del(src.master) - del(src) - return - //OTHER PROCS //To batch-remove wizard spells. Linked to mind.dm. diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 535ed36cebe..078829b7595 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -2,6 +2,7 @@ Desc: Sorta a hack/workaround to get interfaceish things into this engine. To use an interface just override the proc in your object and set it to return true. If an object returns true for one of these it should have ALL of the commented out procs and vars defined in its class. + There may be some example code in procs below the defines to help explain things, but you don't have to use it. */ @@ -27,7 +28,7 @@ Desc: If true is an assembly that can work with the holder Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var - + Holder_Movement()//Called when the holder is moved IsAssembly() return 1 @@ -90,6 +91,8 @@ Desc: If true is an assembly that can work with the holder return */ + + /* Name: IsAssemblyHolder Desc: If true is an object that can hold an assemblyholder object @@ -98,5 +101,53 @@ Desc: If true is an object that can hold an assemblyholder object return 0 /* proc - Process_Activation(var/obj/item/device/D) + Process_Activation(var/obj/D, var/normal = 1, var/special = 1) */ + + + +/* +Name: IsSpecialAssembly +Desc: If true is an object that can be attached to an assembly holder but is a special thing like a plasma can or door +*/ + +/obj/proc/IsSpecialAssembly() + return 0 +/* + var + small_icon_state = null//If this obj will go inside the assembly use this for icons + list/small_icon_state_overlays = null//Same here + obj/holder = null + cooldown = 0//To prevent spam + + proc + Activate()//Called when this assembly is pulsed by another one + Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var + Attach_Holder(var/obj/H, var/mob/user)//Called when an assembly holder attempts to attach, sets src's loc in here + + + Activate() + if(cooldown > 0) + return 0 + cooldown = 2 + spawn(10) + Process_cooldown() + //Rest of code here + return 0 + + + Process_cooldown() + cooldown-- + if(cooldown <= 0) return 0 + spawn(10) + Process_cooldown() + return 1 + + + Attach_Holder(var/obj/H, var/mob/user) + if(!H) return 0 + if(!H.IsAssemblyHolder()) return 0 + //Remember to have it set its loc somewhere in here + + +*/ \ No newline at end of file diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index f3c7a780eeb..d72b323516b 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -16,10 +16,11 @@ secured = 0 obj/item/device/assembly_left = null obj/item/device/assembly_right = null - //The "other" thing will go here + obj/assembly_special = null proc attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user) + attach_special(var/obj/O, var/mob/user) Process_Activation(var/obj/item/device/D) @@ -45,6 +46,18 @@ return 1 + attach_special(var/obj/O, var/mob/user) + if(!O) return + if(!O.IsSpecialAssembly()) return 0 +/* + if(O:Attach_Holder()) + assembly_special = O + update_icon() + src.name = "[assembly_left.name] [assembly_right.name] [assembly_special.name] assembly" +*/ + return + + update_icon() src.overlays = null if(assembly_left) @@ -55,9 +68,13 @@ src.overlays += assembly_right:small_icon_state_right for(var/O in assembly_right:small_icon_state_overlays) src.overlays += text("[]_r", O) -// if(other) -// other.update_icon() - +/* if(assembly_special) + assembly_special.update_icon() + if(assembly_special:small_icon_state) + src.overlays += assembly_special:small_icon_state + for(var/O in assembly_special:small_icon_state_overlays) + src.overlays += O +*/ examine() set src in view() @@ -71,28 +88,33 @@ HasProximity(atom/movable/AM as mob|obj) - if(!assembly_left || !assembly_right) return 0 - assembly_left.HasProximity(AM) - assembly_right.HasProximity(AM) - - - Move()//I dont like this but it will do for now - var/t = src.dir - ..() - if(istype(assembly_left,/obj/item/device/infra)) - assembly_left.dir = t - del(assembly_left:first) - if(istype(assembly_right,/obj/item/device/infra)) - assembly_right.dir = t - del(assembly_right:first) + if(assembly_left) + assembly_left.HasProximity(AM) + if(assembly_right) + assembly_right.HasProximity(AM) + if(assembly_special) + assembly_special.HasProximity(AM) return - attack_hand()//I dont like this one either - if(istype(assembly_left,/obj/item/device/infra)) - del(assembly_left:first) - if(istype(assembly_right,/obj/item/device/infra)) - del(assembly_right:first) + Move() + ..() + if(assembly_left) + assembly_left:Holder_Movement() + if(assembly_right) + assembly_right:Holder_Movement() + if(assembly_special) + assembly_special:Holder_Movement() + return + + + attack_hand()//Perhapse this should be a holder_pickup proc instead, can add if needbe I guess + if(assembly_left) + assembly_left:Holder_Movement() + if(assembly_right) + assembly_right:Holder_Movement() + if(assembly_special) + assembly_special:Holder_Movement() ..() return @@ -100,7 +122,7 @@ attackby(obj/item/weapon/W as obj, mob/user as mob) if(isscrewdriver(W)) if(!assembly_left || !assembly_right) - user.show_message("\red Assembly part missing!") + user.show_message("\red BUG:Assembly part missing, please report this!") return if(src.secured) src.secured = 0 @@ -114,6 +136,8 @@ user.show_message("\blue The [src.name] is ready!") update_icon() return + else if(W.IsSpecialAssembly()) + attach_special(W, user) else ..() return @@ -149,16 +173,17 @@ return - Process_Activation(var/obj/item/device/D) + Process_Activation(var/obj/D, var/normal = 1, var/special = 1) if(!D) return 0 - if(assembly_left == D) - assembly_right:Activate() - //If anymore things can be on a holder this will have to be edited - else if(assembly_right == D) - assembly_left:Activate() -// else if(assemblyother == D) -// assembly_left.Activate() -// assembly_right.Activate() + if((normal) && (assembly_right) && (assembly_left)) + if(assembly_right != D) + assembly_right:Activate() + if(assembly_left != D) + assembly_left:Activate() + if((special) && (assembly_special)) + if(!assembly_special == D) + assembly_left:Activate() + assembly_right:Activate() return 1 @@ -170,4 +195,3 @@ - diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 99983779aa1..8c1e210c794 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -25,6 +25,7 @@ Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var + Holder_Movement()//Called when the holder is moved beam_trigger() @@ -146,6 +147,12 @@ return + Holder_Movement() + if(!holder) return 0 + src.dir = holder.dir + del(src.first) + + beam_trigger() if((!secured)||(!scanning)||(cooldown > 0)) return 0 if((holder)&&(holder.IsAssemblyHolder())) diff --git a/code/names.dm b/code/names.dm index af4bd10e9a3..885669c4cc5 100644 --- a/code/names.dm +++ b/code/names.dm @@ -7,7 +7,6 @@ var/list/commando_names = dd_file2list("config/names/death_commando.txt") var/list/first_names_male = dd_file2list("config/names/first_male.txt") var/list/first_names_female = dd_file2list("config/names/first_female.txt") var/list/last_names = dd_file2list("config/names/last.txt") -var/list/loggedsay = dd_file2list("config/names/loggedsay.txt") var/list/clown_names = dd_file2list("config/names/clown.txt") var/list/verbs = dd_file2list("config/names/verbs.txt") diff --git a/icons/mob/blob.dmi b/icons/mob/blob.dmi index e95f6b6f26f3051502d8a3fc5f1a9c90d19574cc..57dc3581a9f1f2eb59949e2070f4b6c5af9ae37a 100644 GIT binary patch literal 57541 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 literal 10280 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 diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index bfb77eb8a3d..f379ad9fe77 100644 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -252,7 +252,7 @@ "aeR" = (/obj/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold,/turf/simulated/wall/r_wall,/area/prison/cell_block/B) "aeS" = (/obj/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{dir = 1},/turf/simulated/wall/r_wall,/area/prison/rec_room) "aeT" = (/obj/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/wall/r_wall,/area/prison/rec_room) -"aeU" = (/obj/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold,/obj/window/reinforced{dir = 8},/obj/window/reinforced{dir = 1},/obj/window/reinforced{dir = 4},/obj/window/reinforced,/obj/grille,/turf/simulated/floor/plating,/area/prison/rec_room) +"aeU" = (/obj/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Prison Observation Room"; req_access_txt = "1"},/turf/simulated/floor,/area/prison/rec_room) "aeV" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Prison Observation Room"; req_access_txt = "1"},/obj/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple,/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/floor,/area/prison/rec_room) "aeW" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Prison Rec Room"; req_access_txt = "1"},/obj/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/floor,/area/prison/rec_room) "aeX" = (/obj/disposalpipe/junction{dir = 4; icon_state = "pipe-j2"},/obj/machinery/atmospherics/pipe/simple{dir = 4},/turf/simulated/wall/r_wall,/area/prison/rec_room) @@ -5747,7 +5747,7 @@ "cgA" = (/obj/landmark/start,/turf/space,/area) "cgB" = (/turf/unsimulated/wall{icon = 'icons/misc/fullscreen.dmi'; icon_state = "title"; name = "Space Station 13"},/area) "cgC" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership) -"cgD" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership) +"cgD" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership) "cgE" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership) "cgF" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite/mothership) "cgG" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/turf/space,/area/shuttle/syndicate_elite/mothership) @@ -5819,8 +5819,8 @@ "chU" = (/obj/table,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) "chV" = (/turf/unsimulated/wall,/area/centcom) "chW" = (/obj/landmark{name = "Nuclear-Closet"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) -"chX" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "External Airlock"},/area) -"chY" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom) +"chX" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "External Airlock"},/area) +"chY" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom) "chZ" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom) "cia" = (/turf/unsimulated/floor{name = "plating"},/area/centcom) "cib" = (/obj/stool/chair{dir = 4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) @@ -5880,7 +5880,7 @@ "cjd" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom/suppy) "cje" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/suppy) "cjf" = (/turf/unsimulated/floor{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/centcom/suppy) -"cjg" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/suppy) +"cjg" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/suppy) "cjh" = (/obj/machinery/sleeper{icon_state = "sleeper_0-r"; orient = "RIGHT"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) "cji" = (/obj/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) "cjj" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/syndicate_station/start) @@ -5898,7 +5898,7 @@ "cjv" = (/obj/table,/obj/machinery/juicer{pixel_y = 6},/turf/unsimulated/floor{tag = "icon-redyellowfull"; icon_state = "redyellowfull"},/area/centcom/living) "cjw" = (/obj/machinery/door/airlock/external,/turf/unsimulated/floor{name = "plating"},/area/centcom/living) "cjx" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/living) -"cjy" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/living) +"cjy" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/living) "cjz" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/supply/dock) "cjA" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/supply/dock) "cjB" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/supply/dock) @@ -6278,7 +6278,7 @@ "cqL" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) "cqM" = (/obj/stool/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "cqN" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"cqO" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/ferry) +"cqO" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/centcom/ferry) "cqP" = (/turf/unsimulated/floor{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/centcom/ferry) "cqQ" = (/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) "cqR" = (/obj/grille,/obj/window/reinforced{dir = 8},/obj/window/reinforced,/obj/window/reinforced{dir = 1},/obj/window/reinforced{dir = 4},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry) @@ -6288,7 +6288,7 @@ "cqV" = (/obj/stool/chair{dir = 8},/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control) "cqW" = (/obj/machinery/computer/crew,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "cqX" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"cqY" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/centcom/ferry) +"cqY" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/centcom/ferry) "cqZ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/transport1/centcom) "cra" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/transport1/centcom) "crb" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/transport1/centcom) diff --git a/tgstation.dme b/tgstation.dme index 57dac9e66c4..3b064f1418f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -365,6 +365,7 @@ #include "code\game\gamemodes\sandbox\h_sandbox.dm" #include "code\game\gamemodes\sandbox\sandbox.dm" #include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\wizard\spellbook.dm" #include "code\game\gamemodes\wizard\spells.dm" #include "code\game\gamemodes\wizard\wizard.dm" #include "code\game\jobs\access.dm"