From 7363c31ea9969f7a42352214c3f776c87062d9b2 Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Tue, 30 Apr 2019 23:59:28 +0200 Subject: [PATCH 1/3] Initial commit --- code/game/gamemodes/miniantags/morph/morph.dm | 10 ++ .../miniantags/slaughter/slaughter.dm | 4 + code/game/gamemodes/wizard/raginmages.dm | 94 +++++++------------ code/game/gamemodes/wizard/spellbook.dm | 48 +++++----- code/game/gamemodes/wizard/wizard.dm | 11 --- .../antagonists/_common/antag_spawner.dm | 16 ++-- code/modules/mob/dead/observer/observer.dm | 5 + 7 files changed, 83 insertions(+), 105 deletions(-) diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 3bb36870d31..702007aef46 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -45,6 +45,16 @@ You can restore yourself to your original form while morphed by shift-clicking yourself.
\ Finally, you can attack any item or dead creature to consume it - creatures will restore 1/3 of your max health." +/mob/living/simple_animal/hostile/morph/wizard + name = "magical morph" + real_name = "magical morph" + desc = "A revolting, pulsating pile of flesh. This one looks somewhat.. magical." + +/mob/living/simple_animal/hostile/morph/wizard/New() + . = ..() + AddSpell(new /obj/effect/proc_holder/spell/targeted/smoke) + AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall) + /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) if(form) diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 7e74de27267..488525c42a1 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -290,6 +290,10 @@ emote_hear = list("gaffaws", "laughs") response_help = "hugs" attacktext = "wildly tickles" + maxHealth = 150 + health = 150 + melee_damage_lower = 20 + melee_damage_upper = 20 attack_sound = 'sound/items/bikehorn.ogg' feast_sound = 'sound/spookoween/scary_horn2.ogg' diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index bb62b7bebea..467712148d0 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -3,36 +3,35 @@ config_tag = "raginmages" required_players = 20 use_huds = 1 + but_wait_theres_more = 1 var/max_mages = 0 - var/making_mage = 0 + var/making_mage = FALSE var/mages_made = 1 var/time_checked = 0 - var/players_per_mage = 6 // If the admin wants to tweak things or something - but_wait_theres_more = 1 + var/players_per_mage = 10 // If the admin wants to tweak things or something var/delay_per_mage = 4200 // Every 7 minutes by default var/time_till_chaos = 18000 // Half-hour in /datum/game_mode/wizard/raginmages/announce() to_chat(world, "The current game mode is - Ragin' Mages!") - to_chat(world, "The Space Wizard Federation is pissed, help defeat all the space wizards!") - + to_chat(world, "The Space Wizard Federation is pissed, crew must help defeat all the Space Wizards invading the station!") /datum/game_mode/wizard/raginmages/greet_wizard(var/datum/mind/wizard, var/you_are=1) if(you_are) to_chat(wizard.current, "You are the Space Wizard!") - to_chat(wizard.current, "The Space Wizards Federation has given you the following tasks:") + to_chat(wizard.current, "The Space Wizard Federation has given you the following tasks:") var/obj_count = 1 + to_chat(wizard.current, "Supreme Objective: Make sure the station pays for its actions against our diplomats. We might send more Wizards to the station if the situation is not developing in our favour.") for(var/datum/objective/objective in wizard.objectives) to_chat(wizard.current, "Objective #[obj_count]: [objective.explanation_text]") obj_count++ - to_chat(wizard.current, "Objective Alpha: Make sure the station pays for its actions against our diplomats") return /datum/game_mode/wizard/raginmages/check_finished() var/wizards_alive = 0 - // Accidental pun! - var/wizard_cap = (max_mages || (num_players_started() / players_per_mage)) + var/wizard_cap = FLOOR((num_players_started() / players_per_mage), 1) + max_mages = wizard_cap for(var/datum/mind/wizard in wizards) if(isnull(wizard.current)) continue @@ -115,71 +114,44 @@ qdel(B) /datum/game_mode/wizard/raginmages/proc/make_more_mages() - if(making_mage || SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) - return 0 - making_mage = 1 - var/list/candidates = list() + return FALSE + making_mage = TRUE + + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as a raging Space Wizard?", ROLE_WIZARD, TRUE, poll_time = 20 SECONDS) var/mob/dead/observer/harry = null - spawn(rand(200, 600)) - message_admins("SWF is still pissed, sending another wizard - [max_mages - mages_made] left.") - //Protip: This returns clients, not ghosts - candidates = get_candidate_ghosts(ROLE_WIZARD) - if(!candidates.len) - message_admins("No applicable clients for the next ragin' mage, asking ghosts instead.") - var/time_passed = world.time - for(var/mob/dead/observer/G in GLOB.player_list) - if(!jobban_isbanned(G, "wizard") && !jobban_isbanned(G, "Syndicate")) - spawn(0) - switch(alert(G, "Do you wish to be considered for the position of Space Wizard Foundation 'diplomat'?","Please answer in 30 seconds!","Yes","No")) - if("Yes") - if((world.time-time_passed)>300)//If more than 30 game seconds passed. - continue - candidates += G - if("No") - continue - sleep(300) - if(!candidates.len) - message_admins("This is awkward, sleeping until another mage check...") - making_mage = 0 - return + message_admins("SWF is still pissed, sending another wizard - [max_mages - mages_made] left.") + + if(!candidates.len) + message_admins("This is awkward, sleeping until another mage check..") + making_mage = FALSE + sleep(300) + return + else + harry = pick(candidates) + making_mage = FALSE + if(harry) + var/mob/living/carbon/human/new_character= makeBody(harry) + new_character.mind.make_Wizard() // This puts them at the wizard spawn, worry not + mages_made++ + return TRUE else - candidates = shuffle(candidates) - for(var/mob/dead/observer/i in candidates) - if(!i) continue //Dont bother removing them from the list since we only grab one wizard - - // YER A WIZZERD HARRY - harry = i - break - - making_mage = 0 - if(harry) - var/mob/living/carbon/human/new_character= makeBody(harry) - - - new_character.mind.make_Wizard() // This puts them at the wizard spawn, worry not - mages_made++ - return 1 - else - log_runtime(EXCEPTION("The candidates list for ragin' mages contained non-observer entries!"), src) - return 0 + log_runtime(EXCEPTION("The candidates list for ragin' mages contained non-observer entries!"), src) + return FALSE // ripped from -tg-'s wizcode, because whee lets make a very general proc for a very specific gamemode // This probably wouldn't do half bad as a proc in __HELPERS // Lemme know if this causes species to mess up spectacularly or anything /datum/game_mode/wizard/raginmages/proc/makeBody(var/mob/dead/observer/G) - if(!G || !G.key) return // Let's not steal someone's soul here - + if(!G || !G.key) + return // Let's not steal someone's soul here var/mob/living/carbon/human/new_character = new(pick(latejoin)) - G.client.prefs.copy_to(new_character) - new_character.key = G.key - return new_character /datum/game_mode/wizard/raginmages/declare_completion() if(finished) - feedback_set_details("round_end_result","raging wizard loss - wizard killed") - to_chat(world, " The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!") + feedback_set_details("round_end_result", "raging wizard loss - wizard killed") + to_chat(world, " The crew has managed to hold off the Wizard attack! The Space Wizard Federation has been taught a lesson they will not soon forget!") ..(1) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 0a1340d885b..42b07e14c73 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -229,6 +229,12 @@ log_name = "LD" category = "Defensive" +/datum/spellbook_entry/lichdom/IsAvailible() + if(ticker.mode.name == "ragin' mages") + return FALSE + else + return TRUE + /datum/spellbook_entry/lightningbolt name = "Lightning Bolt" spell_type = /obj/effect/proc_holder/spell/targeted/lightning @@ -398,8 +404,8 @@ name = "Bottle of Tickles" desc = "A bottle of magically infused fun, the smell of which will \ attract adorable extradimensional beings when broken. These beings \ - are similar to slaughter demons, but they do not permamently kill \ - their victims, instead putting them in an extradimensional hugspace, \ + are similar to slaughter demons, but are a little weaker and they do not permamently \ + kill their victims, instead putting them in an extradimensional hugspace, \ to be released on the demon's death. Chaotic, but not ultimately \ damaging. The crew's reaction to the other hand could be very \ destructive." @@ -411,7 +417,7 @@ /datum/spellbook_entry/item/oozebottle name = "Bottle of Ooze" - desc = "A bottle of magically infused ooze, which will awake an all-consuming Morph, capable of cunningly disguising itself as any object it comes in contact with. Be careful though, as Morph diet includes Wizards." + desc = "A bottle of magically infused ooze, which will awake an all-consuming Morph, capable of cunningly disguising itself as any object it comes in contact with and even casting some very basic spells. Be careful though, as Morph diet includes Wizards." item_path = /obj/item/antag_spawner/morph cost = 1 log_name = "BO" @@ -419,7 +425,7 @@ category = "Assistance" /datum/spellbook_entry/item/tarotdeck - name = "Tarot Deck" + name = "Guardian Deck" desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \ It would be wise to avoid buying these with anything capable of causing you to swap bodies with others." item_path = /obj/item/guardiancreator @@ -439,14 +445,6 @@ item_path = /obj/item/twohanded/singularityhammer log_name = "SI" -/datum/spellbook_entry/item/cursed_heart - name = "Cursed Heart" - desc = "A heart that has been revived by dark magicks. The user must ensure the heart is manually beaten or their blood circulation will suffer, but every beat heals their injuries. It must beat every 6 seconds." - item_path = /obj/item/organ/internal/heart/cursed/wizard - log_name = "CH" - cost = 1 - category = "Defensive" - /datum/spellbook_entry/summon name = "Summon Stuff" category = "Rituals" @@ -473,9 +471,12 @@ name = "Summon Ghosts" desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you." cost = 0 + log_name = "SGH" /datum/spellbook_entry/summon/ghosts/IsAvailible() - if(!ticker.mode) + if(!ticker.mode) // In case spellbook is placed on map + return FALSE + if(ticker.mode.name == "ragin' mages") return FALSE else return TRUE @@ -489,18 +490,17 @@ /datum/spellbook_entry/summon/guns name = "Summon Guns" - category = "Rituals" - desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long!" + desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long! You will also receive 1 extra point to use in your spellbook." cost = 0 log_name = "SG" /datum/spellbook_entry/summon/guns/IsAvailible() if(!ticker.mode) // In case spellbook is placed on map - return 0 + return FALSE if(ticker.mode.name == "ragin' mages") - return 0 + return FALSE else - return 1 + return TRUE /datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) @@ -512,18 +512,17 @@ /datum/spellbook_entry/summon/magic name = "Summon Magic" - category = "Challenges" - desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." + desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time. You will also receive 1 extra point to use in your spellbook." cost = 0 log_name = "SU" /datum/spellbook_entry/summon/magic/IsAvailible() if(!ticker.mode) // In case spellbook is placed on map - return 0 + return FALSE if(ticker.mode.name == "ragin' mages") - return 0 + return FALSE else - return 1 + return TRUE /datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) @@ -611,9 +610,6 @@ dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.
" dat += "For spells: the number after the spell name is the cooldown time.
" dat += "You can reduce this number by spending more points on the spell.
" - if("Challenges") - dat += "The Wizard Federation typically has hard limits on the potency and number of spells brought to the station based on risk.
" - dat += "Arming the station against you will increases the risk, but will grant you one more charge for your spellbook.
" if("Rituals") dat += "These powerful spells change the very fabric of reality. Not always in your favour.
" return dat diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index b249ebe8520..2c900808652 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -8,7 +8,6 @@ required_enemies = 1 recommended_enemies = 1 free_golems_disabled = TRUE - var/use_huds = 0 var/finished = 0 var/but_wait_theres_more = 0 @@ -17,7 +16,6 @@ to_chat(world, "The current game mode is - Wizard!") to_chat(world, "There is a SPACE WIZARD 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 @@ -42,7 +40,6 @@ ..() return 1 - /datum/game_mode/wizard/post_setup() for(var/datum/mind/wizard in wizards) log_game("[key_name(wizard)] has been selected as a Wizard") @@ -74,7 +71,6 @@ wizhud.join_hud(wiz_mind.current) set_antag_hud(wiz_mind.current, ((wiz_mind in wizards) ? "hudwizard" : "apprentice")) - /datum/game_mode/proc/update_wiz_icons_removed(datum/mind/wiz_mind) var/datum/atom_hud/antag/wizhud = huds[ANTAG_HUD_WIZ] wizhud.leave_hud(wiz_mind.current) @@ -86,7 +82,6 @@ wizard.objectives += wiz_objective return - /datum/game_mode/proc/name_wizard(mob/living/carbon/human/wizard_mob) //Allows the wizard to choose a custom name or go with a random one. Spawn 0 so it does not lag the round starting. var/wizard_name_first = pick(GLOB.wizard_first) @@ -104,7 +99,6 @@ wizard_mob.mind.name = newname return - /datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1) addtimer(CALLBACK(wizard.current, /mob/.proc/playsound_local, null, 'sound/ambience/antag/ragesmages.ogg', 100, 0), 30) if(you_are) @@ -117,7 +111,6 @@ obj_count++ return - /*/datum/game_mode/proc/learn_basic_spells(mob/living/carbon/human/wizard_mob) if(!istype(wizard_mob)) return @@ -165,7 +158,6 @@ wizard_mob.gene_stability += DEFAULT_GENE_STABILITY //magic return 1 - /datum/game_mode/wizard/check_finished() var/wizards_alive = 0 var/traitors_alive = 0 @@ -190,8 +182,6 @@ finished = 1 return 1 - - /datum/game_mode/wizard/declare_completion(var/ragin = 0) if(finished && !ragin) feedback_set_details("round_end_result","wizard loss - wizard killed") @@ -199,7 +189,6 @@ ..() return 1 - /datum/game_mode/proc/auto_declare_completion_wizard() if(wizards.len) var/text = "
the wizards/witches were:" diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 5e434887ee0..17ab0cb40a0 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -31,7 +31,7 @@ return FALSE if(checking) to_chat(user, "The device is already connecting to Syndicate command. Please wait.") - return FALSE + return FALSE return TRUE /obj/item/antag_spawner/nuke_ops/attack_self(mob/user) @@ -164,7 +164,7 @@ var/mob/living/demon_type = /mob/living/simple_animal/slaughter /obj/item/antag_spawner/slaughter_demon/attack_self(mob/user) - if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a demon from the Den.. + if(level_blocks_magic(user.z)) //this is to make sure the wizard does NOT summon a demon from the Den.. to_chat(user, "You should probably wait until you reach the station.") return @@ -174,7 +174,10 @@ used = TRUE to_chat(user, "You break the seal on the bottle, calling upon the dire spirits of the underworld...") - var/list/candidates = pollCandidates("Do you want to play as a slaughter demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100) + var/type = "slaughter" + if(demon_type == /mob/living/simple_animal/slaughter/laughter) + type = "laughter" + var/list/candidates = pollCandidates("Do you want to play as a [type] demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100) if(candidates.len > 0) var/mob/C = pick(candidates) @@ -205,7 +208,6 @@ KillDaCrew.owner = S.mind KillDaCrew.explanation_text = "[objective_verb] everyone else while you're at it." S.mind.objectives += KillDaCrew - S.mind.objectives += KillDaCrew to_chat(S, "Objective #[1]: [KillDaWiz.explanation_text]") to_chat(S, "Objective #[2]: [KillDaCrew.explanation_text]") @@ -217,7 +219,7 @@ color = "#FF69B4" // HOT PINK veil_msg = "You sense an adorable presence \ lurking just beyond the veil..." - objective_verb = "Hug and Tickle" + objective_verb = "Hug and tickle" demon_type = /mob/living/simple_animal/slaughter/laughter ///////////MORPH @@ -245,7 +247,7 @@ used = TRUE to_chat(user, "You break the seal on the bottle, calling upon the dire sludge to awaken...") - var/list/candidates = pollCandidates("Do you want to play as a morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100) + var/list/candidates = pollCandidates("Do you want to play as a magical morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100) if(candidates.len > 0) var/mob/C = pick(candidates) @@ -259,7 +261,7 @@ to_chat(user, "The sludge does not respond to your attempt to awake it. Perhaps you should try again later.") /obj/item/antag_spawner/morph/spawn_antag(client/C, turf/T, type = "", mob/user) - var/mob/living/simple_animal/hostile/morph/M = new /mob/living/simple_animal/hostile/morph(pick(xeno_spawn)) + var/mob/living/simple_animal/hostile/morph/wizard/M = new /mob/living/simple_animal/hostile/morph/wizard(pick(xeno_spawn)) M.key = C.key M.mind.assigned_role = SPECIAL_ROLE_MORPH M.mind.special_role = SPECIAL_ROLE_MORPH diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index b7c301f7387..84b2031aa55 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -95,6 +95,11 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) updateallghostimages() return ..() +/mob/dead/observer/examine(mob/user) + ..() + if(!invisibility) + to_chat(user, "It seems extremely obvious.") + // This seems stupid, but it's the easiest way to avoid absolutely ridiculous shit from happening // Copying an appearance directly from a mob includes it's verb list, it's invisibility, it's alpha, and it's density // You might recognize these things as "fucking ridiculous to put in an appearance" From 5d9008558806eaa209f9d9035fac4beb491b1943 Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Wed, 1 May 2019 12:34:33 +0200 Subject: [PATCH 2/3] Numbers tweak --- code/game/gamemodes/wizard/raginmages.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index 467712148d0..4314544c09e 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -8,7 +8,7 @@ var/making_mage = FALSE var/mages_made = 1 var/time_checked = 0 - var/players_per_mage = 10 // If the admin wants to tweak things or something + var/players_per_mage = 15 // If the admin wants to tweak things or something var/delay_per_mage = 4200 // Every 7 minutes by default var/time_till_chaos = 18000 // Half-hour in @@ -30,7 +30,7 @@ /datum/game_mode/wizard/raginmages/check_finished() var/wizards_alive = 0 - var/wizard_cap = FLOOR((num_players_started() / players_per_mage), 1) + var/wizard_cap = CEILING((num_players_started() / players_per_mage), 1) max_mages = wizard_cap for(var/datum/mind/wizard in wizards) if(isnull(wizard.current)) From c72874399797898f106ff872db154e369e58421c Mon Sep 17 00:00:00 2001 From: Arkatos1 Date: Fri, 3 May 2019 18:44:14 +0200 Subject: [PATCH 3/3] Finishing touches --- code/game/gamemodes/wizard/raginmages.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index 4314544c09e..57a4f4e17de 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -8,7 +8,7 @@ var/making_mage = FALSE var/mages_made = 1 var/time_checked = 0 - var/players_per_mage = 15 // If the admin wants to tweak things or something + var/players_per_mage = 10 // If the admin wants to tweak things or something var/delay_per_mage = 4200 // Every 7 minutes by default var/time_till_chaos = 18000 // Half-hour in