Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion code/__DEFINES/fantasy_affixes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,10 @@
#define AFFIX_SUFFIX (1 << 1)

#define AFFIX_GOOD (1 << 0)
#define AFFIX_EVIL (1 << 1)
#define AFFIX_EVIL (1 << 1)

#define TIER_NORMAL "normal" //white
#define TIER_UNCOMMON "uncommon" //green
#define TIER_RARE "rare" //blue
#define TIER_LEGENDARY "epic" //urple
#define TIER_MYTHICAL "mythical" //orange
56 changes: 41 additions & 15 deletions code/datums/components/fantasy/_fantasy.dm
Original file line number Diff line number Diff line change
@@ -1,3 +1,27 @@
GLOBAL_LIST_INIT(rarity_to_quality, list(
TIER_NORMAL = 0,
TIER_UNCOMMON = 2,
TIER_RARE = 5,
TIER_LEGENDARY = 10,
TIER_MYTHICAL = 25
))

GLOBAL_LIST_INIT(rarity_to_color, list(
TIER_NORMAL = "#FFFFFF",
TIER_UNCOMMON = "#00ff62",
TIER_RARE = "#2600ff",
TIER_LEGENDARY = "#ff00ff",
TIER_MYTHICAL = "#ffd900"
))

GLOBAL_LIST_INIT(rarity_weights, list(
TIER_NORMAL = 55,
TIER_UNCOMMON = 30,
TIER_RARE = 10,
TIER_LEGENDARY = 4,
TIER_MYTHICAL = 1
))

/datum/component/fantasy
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS

Expand All @@ -12,13 +36,17 @@

var/static/list/affixListing

var/rarity = TIER_NORMAL

/datum/component/fantasy/Initialize(quality, list/affixes = list(), canFail=FALSE, announce=FALSE)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE

src.quality = quality || randomQuality()
//src.quality = quality || randomQuality()
src.canFail = canFail
src.announce = announce
src.rarity = randomRarity()
src.quality = GLOB.rarity_to_quality[src.rarity]

src.affixes = affixes
appliedComponents = list()
Expand All @@ -39,21 +67,12 @@

/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, quality, list/affixes, canFail, announce)
unmodify()
if(newComp)
src.quality += newComp.quality
src.canFail = newComp.canFail
src.announce = newComp.announce
else
src.quality += quality
src.canFail = canFail || canFail
src.announce = announce || announce
src.rarity = randomRarity()
src.quality = GLOB.rarity_to_quality[src.rarity]
modify()

/datum/component/fantasy/proc/randomQuality()
var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
if(prob(50))
quality = -quality
return quality
/datum/component/fantasy/proc/randomRarity()
return pickweight(GLOB.rarity_weights)

/datum/component/fantasy/proc/randomAffixes(force)
if(!affixListing)
Expand Down Expand Up @@ -95,12 +114,18 @@
master.bare_wound_bonus += quality

var/newName = originalName

for(var/i in affixes)
var/datum/fantasy_affix/affix = i
newName = affix.apply(src, newName)

if(quality != 0)
newName = "[newName] [quality > 0 ? "+" : ""][quality]"
newName = "[newName][quality > 0 ? "+" : ""][quality]"

var/rarity_string = rarity == TIER_NORMAL ? "" : "[rarity] "
newName = "[rarity_string][newName]"

master.color = GLOB.rarity_to_color[rarity]

if(canFail && prob((quality - 9)*10))
var/turf/place = get_turf(parent)
Expand Down Expand Up @@ -128,6 +153,7 @@
master.bare_wound_bonus -= quality

master.name = originalName
master.color = null

/datum/component/fantasy/proc/announce()
var/turf/location = get_turf(parent)
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items.dm
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/effects/fire.dmi', FIRE))

GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
GLOBAL_VAR_INIT(rpg_loot_items, TRUE)
// if true, everyone item when created will have its name changed to be
// more... RPG-like.

Expand Down
67 changes: 67 additions & 0 deletions code/modules/af/anvil.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#define SUPER_CREDIT_REROLL_COST 1
GLOBAL_VAR_INIT(anvil_cooldown, 1 SECONDS)

/obj/machinery/anvil
name = "Enchantment Anvil"
desc = "Used to enchant your weapons and armor to Win The Game!"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
icon = 'icons/obj/lavaland/anvil.dmi'
icon_state = "fool"
density = TRUE
var/list/concurrent_users = list()

/obj/machinery/anvil/Destroy()
QDEL_LIST_ASSOC_VAL(concurrent_users)
return ..()

/obj/machinery/anvil/attack_hand(mob/living/user)
. = ..()
if(.)
return
use_anvil_ui(user)

/obj/machinery/anvil/attackby(obj/item/reforge_target, mob/user, params)
if(!reforge_target.GetComponent(/datum/component/fantasy))
to_chat(user, span_danger("You can't enchant this item."))
return

use_anvil_ui(user, reforge_target)

/obj/machinery/anvil/proc/use_anvil_ui(mob/user, obj/item/reforge_target)

if(!concurrent_users[user.ckey])
concurrent_users[user.ckey] = new /datum/reforge_menu(user, src)

var/datum/reforge_menu/player_menu = concurrent_users[user.ckey]
if(reforge_target)
player_menu.set_target_item(reforge_target)

player_menu.ui_interact(user)

/obj/machinery/anvil/proc/reroll(obj/item/reforge_target, mob/user, datum/reforge_menu/player_menu)
if(player_menu.use_super_credits)
if(user.mind.super_credits < SUPER_CREDIT_REROLL_COST)
to_chat(user, "You don't have any Super Credit(TM) to use!")
player_menu.use_super_credits = FALSE
return
to_chat(user, "You spend a Super Credit(TM) to boost your reroll chances!")
user.mind.super_credits -= SUPER_CREDIT_REROLL_COST
var/old_name = reforge_target.name
var/datum/component/fantasy/F = reforge_target.GetComponent(/datum/component/fantasy)
reforge_target.AddComponent(/datum/component/fantasy, 0, null, null, FALSE, FALSE) //this is bad code
var/new_rarity = F.rarity
playsound(get_turf(src), "sound/effects/anvil/tinker.ogg", 40)
to_chat(user, "You reroll your [old_name] to a [reforge_target.name]!")
set_light(l_range = 3, l_power = 3, l_color = GLOB.rarity_to_color[new_rarity])
addtimer(CALLBACK(src, PROC_REF(reset_light)), GLOB.anvil_cooldown, TIMER_UNIQUE|TIMER_OVERRIDE)
if(new_rarity == TIER_LEGENDARY || new_rarity == TIER_MYTHICAL)
for(var/mob/M in SSmobs.clients_by_zlevel[z])
to_chat(M, span_alert("[user] has rolled [reforge_target]!"))
if(M.client.prefs.toggles & SOUND_AMBIENCE)
playsound(get_turf(src), "sound/effects/anvil/congrats.ogg", 60, extrarange = 100) //EVERYONE
playsound(get_turf(src), "sound/effects/anvil/fireworks.ogg", 60, extrarange = 100)
COOLDOWN_START(player_menu, reroll_cooldown, GLOB.anvil_cooldown)


/obj/machinery/anvil/proc/reset_light()
set_light(l_range = 0, l_power = 0, l_color = null)
8 changes: 8 additions & 0 deletions code/modules/af/holiday.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/datum/holiday/april_fools/celebrate()
SSjob.set_overflow_role("Clown")
SSticker.OnRoundstart(CALLBACK(src, PROC_REF(roundstart_celebrate)))

/datum/holiday/april_fools/proc/roundstart_celebrate()
var/obj/effect/landmark/observer_start/O = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list
if(O)
new/obj/machinery/anvil(O.loc)
14 changes: 14 additions & 0 deletions code/modules/af/mind.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/datum/mind
var/super_credits = -1

/datum/mind/proc/initialize_credits()
if(super_credits == -1)
super_credits = 10
if(is_donator(current))
super_credits += 10
if(is_donator(current) && (!is_admin(current) && !is_deadmin(current) && !is_mentor(current))) //actual donators get 20 more
super_credits += 20

/mob/sync_mind()
. = ..()
mind?.initialize_credits()
86 changes: 86 additions & 0 deletions code/modules/af/reforge_menu.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/datum/reforge_menu
var/mob/owner
var/obj/machinery/anvil/parent_anvil
var/obj/item/reforge_target
var/use_super_credits = FALSE
COOLDOWN_DECLARE(reroll_cooldown)

/datum/reforge_menu/New(mob/new_owner, obj/machinery/anvil/parent_anvil)
if(!istype(new_owner))
qdel(src)
src.owner = new_owner
src.parent_anvil = parent_anvil

RegisterSignal(parent_anvil, COMSIG_QDELETING, PROC_REF(on_anvil_destroyed))

/datum/reforge_menu/ui_state(mob/user)
return GLOB.physical_state

/datum/reforge_menu/Destroy()
owner = null
parent_anvil = null
reforge_target = null
return ..()

/datum/reforge_menu/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if (!ui)
ui = new(user, src, "ReforgerMenu")
ui.open()

/datum/reforge_menu/ui_host()
return parent_anvil

/datum/reforge_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
switch(action)
if ("reroll")
if(!COOLDOWN_FINISHED(src, reroll_cooldown))
to_chat(owner, span_danger("The cooldown for rerolling hasn't finished yet."))
return
parent_anvil.reroll(reforge_target, owner, src)
. = TRUE
if ("toggle_super_credits")
use_super_credits = !use_super_credits
. = TRUE

/datum/reforge_menu/ui_data(mob/user)
var/list/data = list()
data["reforge_cooldown"] = reroll_cooldown - world.time
data["super_credits_available"] = user.mind.super_credits
data["use_super_credits"] = use_super_credits
data["reforge_target"] = null
if(reforge_target)
var/list/details = list()
details["name"] = reforge_target.name
details["description"] = reforge_target.desc
var/datum/component/fantasy/fantasy_affix = reforge_target.GetComponent(/datum/component/fantasy)
details["rarity"] = list("name" = fantasy_affix.rarity, "color" = GLOB.rarity_to_color[fantasy_affix.rarity], "chances" = GLOB.rarity_weights[fantasy_affix.rarity])
details["item_pic"] = icon2base64(getFlatIcon(reforge_target))
data["reforge_target"] = details
return data

/datum/reforge_menu/ui_static_data(mob/user)
var/list/data = list()
data["rarities"] = list()
var/rarity_total_weight = 0
for(var/rarity in GLOB.rarity_weights)
var/list/rarity_data = list()
rarity_data["name"] = rarity
rarity_data["color"] = GLOB.rarity_to_color[rarity]
rarity_data["weight"] = GLOB.rarity_weights[rarity]

data["rarities"] += list(rarity_data)
rarity_total_weight += GLOB.rarity_weights[rarity]

data["rarity_total_weight"] = rarity_total_weight
return data

/datum/reforge_menu/proc/set_target_item(obj/item/new_reforge_target)
src.reforge_target = new_reforge_target

/datum/reforge_menu/proc/on_anvil_destroyed()
qdel(src)

4 changes: 2 additions & 2 deletions code/modules/holiday/holidays.dm
Original file line number Diff line number Diff line change
Expand Up @@ -250,8 +250,8 @@
"https://www.youtube.com/watch?v=9whQIbNmu9s" // Clown.wmv - Admiral Hippie
)

/datum/holiday/april_fools/celebrate()
SSjob.set_overflow_role("Clown")
///datum/holiday/april_fools/celebrate()
//SSjob.set_overflow_role("Clown")

/datum/holiday/april_fools/get_holiday_colors(atom/thing_to_color)
return "#[random_short_color()]"
Expand Down
Binary file modified icons/obj/lavaland/anvil.dmi
Binary file not shown.
Binary file added sound/effects/anvil/congrats.ogg
Binary file not shown.
3 changes: 3 additions & 0 deletions sound/effects/anvil/credits.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
congrats.ogg - https://freesound.org/people/dersuperanton/sounds/433702/
fireworks.ogg - https://freesound.org/people/felix.blume/sounds/140350/
tinker.ogg - https://freesound.org/people/ldezem/sounds/386125/
Binary file added sound/effects/anvil/fireworks.ogg
Binary file not shown.
Binary file added sound/effects/anvil/tinker.ogg
Binary file not shown.
Loading