Bundle in new mods

This commit is contained in:
Agent X 2023-12-18 17:01:33 -05:00
parent ffe177a50b
commit b97e968fed
109 changed files with 9498 additions and 33 deletions

View file

@ -69,11 +69,19 @@ function string_space_to_underscore(string)
return s
end
function version_coop_dx()
if SM64COOPDX_VERSION then
return true
else
return false
end
end
----------------------
-- Global Variables --
----------------------
modVersion = "1.5"
modVersion = "1.5.1"
allowMenu = {}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,5 +1,5 @@
-- name: Character Select
-- description: A Library / API made to make adding and\nusing Custom Characters as simple as possible!\n\nCreated by:\\#008800\\ Squishy6094\n\\#dcdcdc\\Concepts by:\\#4496f5\\ AngelicMiracles\\#AAAAFF\\\n\nGithub:\nSquishy6094/character-select-coop
-- description: \\#ffff00\\ ----- Character Select Coop ----- \n\n\\#dcdcdc\\A Library / API made to make adding and using Custom Characters as simple as possible!\n\nCreated by:\\#008800\\ Squishy6094\n\\#dcdcdc\\Concepts by:\\#4496f5\\ AngelicMiracles\\#AAAAFF\\\n\nGithub:\nSquishy6094/character-select-coop
menu = false
@ -40,6 +40,7 @@ local optionTableRef = {
inputLatency = 4,
localModels = 5,
prefToDefault = 6,
--debugInfo = 7
}
optionTable = {
@ -88,6 +89,15 @@ optionTable = {
toggleMax = 1,
toggleNames = {"", ""},
},
--[[
[optionTableRef.debugInfo] = {
name = "Debugging Info",
toggle = tonumber(mod_storage_load("debuginfo")),
toggleSaveName = "debuginfo",
toggleDefault = 0,
toggleMax = 1,
},
]]
}
local defaultPlayerColors = {
@ -161,7 +171,9 @@ local function load_preferred_char()
for i = 2, #characterTable do
if characterTable[i].name == mod_storage_load("PrefChar") then
currChar = i
djui_popup_create('Character Select:\nYour Preferred Character\n"'..string_underscore_to_space(characterTable[i].name)..'"\nwas applied successfully!', 4)
if optionTable[optionTableRef.localModels].toggle == 1 then
djui_popup_create('Character Select:\nYour Preferred Character\n"'..string_underscore_to_space(characterTable[i].name)..'"\nwas applied successfully!', 4)
end
break
end
end
@ -341,9 +353,20 @@ local optionAnimTimerCap = optionAnimTimer
local inputStallTimer = 0
local inputStallTo = 15
local FONT_CS_NORMAL = FONT_NORMAL
if version_coop_dx() then
FONT_CS_NORMAL = FONT_ALIASED
end
local TEXT_OPTIONS_HEADER = "Menu Options"
local TEXT_VERSION = "Version: "..modVersion
if version_coop_dx() then
TEXT_VERSION = TEXT_VERSION.." | CoopDX Detected"
end
local TEXT_RATIO_UNSUPPORTED = "Your Current Aspect-Ratio isn't Supported!"
local TEXT_DESCRIPTION = "Character Description:"
local TEXT_DESCRIPTION_SHORT = "Description"
local TEXT_DEBUGGING = "Debug"
local TEXT_PREF_SAVE = "Press A to Set as Preferred Character"
local TEXT_PAUSE_Z_OPEN = "Z Button - Character Select"
local TEXT_PAUSE_CURR_CHAR = "Current Character: "
@ -361,7 +384,7 @@ local menuColor = characterTable[currChar].color
local function on_hud_render()
djui_hud_set_resolution(RESOLUTION_N64)
djui_hud_set_font(FONT_NORMAL)
djui_hud_set_font(FONT_CS_NORMAL)
local width = djui_hud_get_screen_width() + 1.4
local height = 240
@ -438,24 +461,45 @@ local function on_hud_render()
djui_hud_set_color(0, 0, 0, 255)
djui_hud_render_rect(width - x + 2, 2, x - 4, height - 4)
djui_hud_set_color(menuColor.r, menuColor.g, menuColor.b, 255)
djui_hud_set_font(FONT_NORMAL)
djui_hud_set_font(FONT_CS_NORMAL)
local TEXT_NAME = string_underscore_to_space(characterTable[currChar].name)
local TEXT_CREDIT = "By: "..characterTable[currChar].credit
local TEXT_DESCRIPTION_TABLE = characterTable[currChar].description
local TEXT_PREF = 'Preferred Character: "'..string_underscore_to_space(TEXT_PREF_LOAD)..'"'
--if optionTable[optionTableRef.debugInfo].toggle == 0 then -- Actual Description
local TEXT_NAME = characterTable[currChar].name
local TEXT_CREDIT = "Credit: "..characterTable[currChar].credit
local TEXT_DESCRIPTION_TABLE = characterTable[currChar].description
local TEXT_PREF = 'Preferred Character: "'..string_underscore_to_space(TEXT_PREF_LOAD)..'"'
local textX = x * 0.5
djui_hud_print_text(TEXT_NAME, width - textX - djui_hud_measure_text(TEXT_NAME)*0.3, 55, 0.6)
djui_hud_set_font(FONT_TINY)
djui_hud_print_text(TEXT_CREDIT, width - textX - djui_hud_measure_text(TEXT_CREDIT)*0.3, 72, 0.6)
djui_hud_set_font(FONT_NORMAL)
djui_hud_print_text(TEXT_DESCRIPTION, width - textX - djui_hud_measure_text(TEXT_DESCRIPTION)*0.2, 85, 0.4)
for i = 1, #TEXT_DESCRIPTION_TABLE do
djui_hud_print_text(TEXT_DESCRIPTION_TABLE[i], width - textX - djui_hud_measure_text(TEXT_DESCRIPTION_TABLE[i])*0.15, 90 + i*9, 0.3)
local textX = x * 0.5
djui_hud_print_text(TEXT_NAME, width - textX - djui_hud_measure_text(TEXT_NAME)*0.3, 55, 0.6)
djui_hud_set_font(FONT_TINY)
djui_hud_print_text(TEXT_CREDIT, width - textX - djui_hud_measure_text(TEXT_CREDIT)*0.3, 72, 0.6)
djui_hud_set_font(FONT_CS_NORMAL)
djui_hud_print_text(TEXT_DESCRIPTION, width - textX - djui_hud_measure_text(TEXT_DESCRIPTION)*0.2, 85, 0.4)
for i = 1, #TEXT_DESCRIPTION_TABLE do
djui_hud_print_text(TEXT_DESCRIPTION_TABLE[i], width - textX - djui_hud_measure_text(TEXT_DESCRIPTION_TABLE[i])*0.15, 90 + i*9, 0.3)
end
djui_hud_print_text(TEXT_PREF, width - textX - djui_hud_measure_text(TEXT_PREF)*0.15, height - 20, 0.3)
djui_hud_print_text(TEXT_PREF_SAVE, width - textX - djui_hud_measure_text(TEXT_PREF_SAVE)*0.15, height - 30, 0.3)
--[[
else -- Debugging Info (Unfinished)
local TEXT_NAME = "Name: "..characterTable[currChar].name
local TEXT_CREDIT = "Credit: "..characterTable[currChar].credit
local TEXT_DESCRIPTION_TABLE = characterTable[currChar].description
local TEXT_PREF = 'Preferred: "'..string_underscore_to_space(TEXT_PREF_LOAD)..'"'
local textX = x * 0.5
djui_hud_print_text(TEXT_DEBUGGING, width - textX - djui_hud_measure_text(TEXT_DEBUGGING)*0.3, 55, 0.6)
djui_hud_set_font(FONT_TINY)
djui_hud_print_text(TEXT_NAME, width - x + 8, 72, 0.6)
djui_hud_print_text(TEXT_CREDIT, width - x + 8, 82, 0.6)
djui_hud_print_text(TEXT_DESCRIPTION_SHORT, width - x + 8, 92, 0.6)
for i = 1, #TEXT_DESCRIPTION_TABLE do
djui_hud_print_text(TEXT_DESCRIPTION_TABLE[i], width - x + 8, 101 + i*9, 0.6)
end
local descriptionOffset = #TEXT_DESCRIPTION_TABLE * 9
djui_hud_print_text(TEXT_PREF, width - textX - djui_hud_measure_text(TEXT_PREF)*0.15, 112 + descriptionOffset, 0.3)
end
djui_hud_print_text(TEXT_PREF, width - textX - djui_hud_measure_text(TEXT_PREF)*0.15, height - 20, 0.3)
djui_hud_print_text(TEXT_PREF_SAVE, width - textX - djui_hud_measure_text(TEXT_PREF_SAVE)*0.15, height - 30, 0.3)
]]
--Character Select Header
djui_hud_set_color(menuColor.r, menuColor.g, menuColor.b, 255)
@ -466,7 +510,7 @@ local function on_hud_render()
djui_hud_render_texture(TEX_HEADER, widthHalf - 128, 10, 1, 1)
djui_hud_set_color(menuColor.r, menuColor.g, menuColor.b, 255)
djui_hud_set_font(FONT_TINY)
djui_hud_print_text("Version: "..modVersion, 5, 3, 0.5)
djui_hud_print_text(TEXT_VERSION, 5, 3, 0.5)
--Unsupported Res Warning
if width < 321.2 or width > 575 then
djui_hud_print_text(TEXT_RATIO_UNSUPPORTED, 5, 39, 0.5)
@ -482,7 +526,7 @@ local function on_hud_render()
djui_hud_render_rect(width*0.5 - 50 * widthScale + 2, math.min(55 - optionAnimTimer + 2, height - 25 * widthScale + 2), 100 * widthScale - 4, 196)
djui_hud_set_color(menuColor.r, menuColor.g, menuColor.b, 255)
djui_hud_render_rect(width*0.5 - 50 * widthScale, height - 2, 100 * widthScale, 2)
djui_hud_set_font(FONT_NORMAL)
djui_hud_set_font(FONT_CS_NORMAL)
djui_hud_set_color(menuColor.r * 0.5 + 127, menuColor.g * 0.5 + 127, menuColor.b * 0.5 + 127, 255)
djui_hud_print_text(TEXT_OPTIONS_HEADER, widthHalf - djui_hud_measure_text(TEXT_OPTIONS_HEADER)*0.3*widthScale, 65 + optionAnimTimer * -1, 0.6*widthScale)
@ -492,7 +536,7 @@ local function on_hud_render()
local scale = 0.5
local yOffset = 70 + 10 * math_min(widthScale, 1.8) + i * 9 * math_min(widthScale, 1.8) - optionAnimTimer
if i == currOption then
djui_hud_set_font(FONT_NORMAL)
djui_hud_set_font(FONT_CS_NORMAL)
scale = 0.3
yOffset = yOffset - 1
if optionTable[i].toggleNames[optionTable[i].toggle + 1] ~= "" then
@ -519,7 +563,7 @@ local function on_hud_render()
djui_hud_render_rect(widthHalf - 50 * widthScaleUnlimited + 2, height - 25 * widthScale + 2, 100 * widthScaleUnlimited - 4, 22 * widthScale)
djui_hud_set_color(menuColor.r, menuColor.g, menuColor.b, 255)
djui_hud_render_rect(widthHalf - 50 * widthScaleUnlimited, height - 2, 100 * widthScaleUnlimited, 2)
djui_hud_set_font(FONT_NORMAL)
djui_hud_set_font(FONT_CS_NORMAL)
djui_hud_print_text(TEXT_OPTIONS_OPEN, widthHalf - djui_hud_measure_text(TEXT_OPTIONS_OPEN)*0.175 * widthScale, height - 23 * widthScale + optionAnimTimer + 202, 0.35 * widthScale)
djui_hud_set_font(FONT_TINY)
djui_hud_print_text(TEXT_MENU_CLOSE, widthHalf - djui_hud_measure_text(TEXT_MENU_CLOSE)*0.25 * widthScale, height - 13 * widthScale + optionAnimTimer + 202, 0.5 * widthScale)
@ -556,9 +600,11 @@ local function on_hud_render()
if optionTable[optionTableRef.openInputs].toggle == 2 then
currCharY = 27
local width = djui_hud_get_screen_width() - djui_hud_measure_text(TEXT_PAUSE_Z_OPEN)
djui_hud_set_font(FONT_NORMAL)
djui_hud_set_color(0, 0, 0, 255)
djui_hud_print_text(TEXT_PAUSE_Z_OPEN, width - 19, 17, 1)
djui_hud_set_font(FONT_CS_NORMAL)
if not version_coop_dx() then -- Done to match DX not having dropshadow on the "R Button - Options" thingy
djui_hud_set_color(0, 0, 0, 255)
djui_hud_print_text(TEXT_PAUSE_Z_OPEN, width - 19, 17, 1)
end
djui_hud_set_color(255, 255, 255, 255)
djui_hud_print_text(TEXT_PAUSE_Z_OPEN, width - 20, 16, 1)
end
@ -568,18 +614,22 @@ local function on_hud_render()
local TEXT_PAUSE_CURR_CHAR_WITH_NAME = TEXT_PAUSE_CURR_CHAR..charName
local width = djui_hud_get_screen_width() - djui_hud_measure_text(TEXT_PAUSE_CURR_CHAR_WITH_NAME)
local charColor = characterTable[currChar].color
djui_hud_set_font(FONT_NORMAL)
djui_hud_set_color(0, 0, 0, 255)
djui_hud_print_text(TEXT_PAUSE_CURR_CHAR_WITH_NAME, width - 19, 17 + currCharY, 1)
djui_hud_set_font(FONT_CS_NORMAL)
if not version_coop_dx() then
djui_hud_set_color(0, 0, 0, 255)
djui_hud_print_text(TEXT_PAUSE_CURR_CHAR_WITH_NAME, width - 19, 17 + currCharY, 1)
end
djui_hud_set_color(255, 255, 255, 255)
djui_hud_print_text(TEXT_PAUSE_CURR_CHAR, width - 20, 16 + currCharY, 1)
djui_hud_set_color(charColor.r, charColor.g, charColor.b, 255)
djui_hud_print_text(charName, djui_hud_get_screen_width() - djui_hud_measure_text(charName) - 20, 16 + currCharY, 1)
else
local width = djui_hud_get_screen_width() - djui_hud_measure_text(TEXT_LOCAL_MODEL_OFF)
djui_hud_set_font(FONT_NORMAL)
djui_hud_set_color(0, 0, 0, 255)
djui_hud_print_text(TEXT_LOCAL_MODEL_OFF, width - 19, 17 + currCharY, 1)
djui_hud_set_font(FONT_CS_NORMAL)
if not version_coop_dx() then
djui_hud_set_color(0, 0, 0, 255)
djui_hud_print_text(TEXT_LOCAL_MODEL_OFF, width - 19, 17 + currCharY, 1)
end
djui_hud_set_color(255, 255, 255, 255)
djui_hud_print_text(TEXT_LOCAL_MODEL_OFF, width - 20, 16 + currCharY, 1)
end

View file

@ -144,4 +144,4 @@ _G.charSelect = {
get_status = get_status,
optionTableRef = optionTableRef,
controller = controller,
}
}

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,9 @@
# Day Night Cycle
<a href="http://www.youtube.com/watch?feature=player_embedded&v=2OhIsYoHrlA" target="_blank">
<img src="http://img.youtube.com/vi/2OhIsYoHrlA/mqdefault.jpg" alt="Watch the video" width="640" height="360" border="10" />
</a>
This mod adds a fully featured day night cycle system with night, sunrise, day and sunset to sm64ex-coop. Days last 24 minutes and you can switch to and from 24 hour time with /ampm
Special thanks to AngelicMiracles for the sunset, sunrise and night time skyboxes

View file

@ -0,0 +1,69 @@
-- localize functions to improve performance
local play_sound,table_insert,get_skybox,level_is_vanilla_level,math_floor,math_ceil = play_sound,table.insert,get_skybox,level_is_vanilla_level,math.floor,math.ceil
if SM64COOPDX_VERSION == nil then
local first = false
hook_event(HOOK_ON_LEVEL_INIT, function()
if not first then
first = true
play_sound(SOUND_MENU_CAMERA_BUZZ, gMarioStates[0].marioObj.header.gfx.cameraToObject)
djui_chat_message_create("\\#ff7f7f\\Day Night Cycle is no longer supported with sm64ex-coop\nas it uses sm64coopdx exclusive Lua functionality.\n\\#dcdcdc\\To play this mod, try out sm64coopdx at\n\\#7f7fff\\https://sm64coopdx.com")
end
end)
return
end
function if_then_else(cond, ifTrue, ifFalse)
if cond then return ifTrue end
return ifFalse
end
function split(s)
local result = {}
for match in (s):gmatch(string.format("[^%s]+", " ")) do
table_insert(result, match)
end
return result
end
function lerp(a, b, t) return a * (1 - t) + b * t end
--- @param a Color
--- @param b Color
--- @return Color
function color_lerp(a, b, t)
return {
r = lerp(a.r, b.r, t),
g = lerp(a.g, b.g, t),
b = lerp(a.b, b.b, t)
}
end
function SEQUENCE_ARGS(priority, seqId)
return ((priority << 8) | seqId)
end
function on_or_off(value)
if value then return "\\#00ff00\\ON" end
return "\\#ff0000\\OFF"
end
function show_day_night_cycle()
local skybox = get_skybox()
return skybox ~= -1 and
skybox ~= BACKGROUND_CUSTOM and
skybox ~= BACKGROUND_FLAMING_SKY and
skybox ~= BACKGROUND_GREEN_SKY and
skybox ~= BACKGROUND_HAUNTED and
skybox ~= BACKGROUND_PURPLE_SKY and
skybox ~= BACKGROUND_UNDERWATER_CITY
end
function in_vanilla_level(levelNum)
return gNetworkPlayers[0].currLevelNum == levelNum and level_is_vanilla_level(levelNum)
end
function lerp_round(a, b, t)
local x = lerp(a, b, t)
return x >= 0 and math_floor(x + 0.5) or math_ceil(x - 0.5)
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,134 @@
function delete_at_dark() end
if SM64COOPDX_VERSION == nil then return end
gGlobalSyncTable.time = 0
gGlobalSyncTable.timeScale = 1
local sNightSequences = {}
-- localize functions to improve performance
local math_floor,network_is_server,djui_hud_is_pause_menu_created,smlua_audio_utils_replace_sequence,fade_volume_scale,set_background_music,obj_mark_for_deletion = math.floor,network_is_server,djui_hud_is_pause_menu_created,smlua_audio_utils_replace_sequence,fade_volume_scale,set_background_music,obj_mark_for_deletion
mod_storage_remove("ampm")
use24h = mod_storage_load_bool("24h") or false
local savedInMenu = false
local autoSaveTimer = 0
playingNightMusic = false
--- Returns the amount of days that have passed
function get_day_count()
return math_floor(gGlobalSyncTable.time / (MINUTE * 24))
end
function save_time()
mod_storage_save_number("time", gGlobalSyncTable.time)
print("Saving time to 'day-night-cycle.sav'")
end
function load_time()
local time = mod_storage_load_number("time")
if time == nil then
time = MINUTE * 4 -- starts at the beginning of sunrise
mod_storage_save_number("time", time)
end
return time
end
gGlobalSyncTable.time = load_time()
--- @return string
--- Returns the properly formatted time string
function get_time_string()
local minutes = (gGlobalSyncTable.time / MINUTE) % 24
local formattedMinutes = math_floor(minutes)
local seconds = math_floor(gGlobalSyncTable.time / SECOND) % 60
if not use24h then
if formattedMinutes == 0 then
formattedMinutes = 12
elseif formattedMinutes > 12 then
formattedMinutes = formattedMinutes - 12
end
end
return math_floor(formattedMinutes) .. ":" .. string.format("%02d", seconds) .. if_then_else(not use24h, if_then_else(minutes < 12, " AM", " PM"), "")
end
function time_tick()
if not network_is_server() then return end
gGlobalSyncTable.time = gGlobalSyncTable.time + gGlobalSyncTable.timeScale
-- auto save every 30s
autoSaveTimer = (autoSaveTimer + 1) % (SECOND * 30)
if autoSaveTimer == 0 then
save_time()
end
-- save when paused
if djui_hud_is_pause_menu_created() then
if not savedInMenu then
save_time()
savedInMenu = true
end
else
savedInMenu = false
end
end
function night_music_register(sequenceId, m64Name)
local id = SEQ_COUNT + sequenceId
smlua_audio_utils_replace_sequence(id, 20, 127, m64Name)
sNightSequences[sequenceId] = id
end
function handle_night_music()
if not show_day_night_cycle() or gNetworkPlayers[0].currActNum == 99 or gMarioStates[0].area == nil then return end
local seq = sNightSequences[gMarioStates[0].area.musicParam2]
if seq == nil then return end
fade_volume_scale(0, 127, 1)
local minutes = (gGlobalSyncTable.time / MINUTE) % 24
if minutes >= HOUR_SUNSET_END + 0.75 and minutes <= HOUR_NIGHT_START then
local threshold = 1 - (minutes - (HOUR_SUNSET_END + 0.75)) * 4 -- multiply by 4 because four quarters make a whole
fade_volume_scale(SEQ_PLAYER_LEVEL, threshold * 127, 1)
elseif minutes >= HOUR_SUNRISE_START + 0.75 and minutes <= HOUR_SUNRISE_END then
local threshold = 1 - (minutes - (HOUR_SUNRISE_START + 0.75)) * 4
fade_volume_scale(SEQ_PLAYER_LEVEL, threshold * 127, 1)
end
if (minutes >= HOUR_NIGHT_START or minutes < HOUR_SUNRISE_END) and not playingNightMusic then
playingNightMusic = true
fade_volume_scale(SEQ_PLAYER_LEVEL, 127, 1)
set_background_music(0, SEQUENCE_ARGS(4, seq), 450)
elseif minutes >= HOUR_SUNRISE_END and minutes < HOUR_NIGHT_START and playingNightMusic then
playingNightMusic = false
fade_volume_scale(0, 127, 1)
set_background_music(0, SEQUENCE_ARGS(4, gMarioStates[0].area.musicParam2), 0)
end
end
--- @return number
--- Returns the time in frames
function get_raw_time()
return gGlobalSyncTable.time
end
--- @param time number
--- @return nil
--- Sets the time in frames
function set_raw_time(time)
if type(time) ~= "number" then return end
gGlobalSyncTable.time = time
end
--- @param o Object
function delete_at_dark(o)
local minutes = gGlobalSyncTable.time / MINUTE % 24
if minutes < HOUR_SUNRISE_START or minutes > HOUR_SUNSET_END then
obj_mark_for_deletion(o)
end
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,427 @@
-- name: .Day Night Cycle DX
-- incompatible: light
-- description: Day Night Cycle DX v2.0\nBy \\#ec7731\\Agent X\n\n\\#dcdcdc\\This mod adds a fully featured day night cycle system with night, sunrise, day and sunset to sm64coopdx. Days last 24 minutes and you can switch to and from 24 hour time with /ampm\n\nSpecial thanks to \\#00ffff\\AngelicMiracles \\#dcdcdc\\for the sunset, sunrise and night time skyboxes
-- deluxe: true
--- @diagnostic disable: undefined-global
if SM64COOPDX_VERSION == nil then return end
SECOND = 30
MINUTE = SECOND * 60
HOUR_SUNRISE_START = 4
HOUR_SUNRISE_END = 5
HOUR_SUNRISE_DURATION = HOUR_SUNRISE_END - HOUR_SUNRISE_START
HOUR_SUNSET_START = 19
HOUR_SUNSET_END = 20
HOUR_SUNSET_DURATION = HOUR_SUNSET_END - HOUR_SUNSET_START
HOUR_DAY_START = 6
HOUR_NIGHT_START = 21
local DIR_DARK = 0.6
local DIR_BRIGHT = 1
local COLOR_NIGHT = { r = 70, g = 75, b = 100 }
local COLOR_SUNRISE = { r = 255, g = 255, b = 200 }
local COLOR_DAY = { r = 255, g = 255, b = 255 }
local COLOR_SUNSET = { r = 255, g = 155, b = 100 }
local FOG_COLOR_NIGHT = { r = 30, g = 30, b = 50 }
local COLOR_DISPLAY_DARK = { r = 48, g = 90, b = 200 }
local COLOR_DISPLAY_BRIGHT = { r = 255, g = 255, b = 80 }
local SKYBOX_SCALE = 200
local REAL_MINUTE = 1 / 60
gGlobalSyncTable.dncEnabled = true
local dncDisplayTime = true
-- localize functions to improve performance
local network_is_moderator,network_is_server,set_override_envfx,set_lighting_dir,set_lighting_color,get_skybox,obj_get_first_with_behavior_id,spawn_non_sync_object,obj_scale,clampf,djui_hud_set_resolution,djui_hud_set_font,hud_is_hidden,djui_hud_get_screen_width,djui_hud_measure_text,djui_hud_get_screen_height,djui_hud_set_color,djui_hud_print_text,djui_chat_message_create,math_floor = network_is_moderator,network_is_server,set_override_envfx,set_lighting_dir,set_lighting_color,get_skybox,obj_get_first_with_behavior_id,spawn_non_sync_object,obj_scale,clampf,djui_hud_set_resolution,djui_hud_set_font,hud_is_hidden,djui_hud_get_screen_width,djui_hud_measure_text,djui_hud_get_screen_height,djui_hud_set_color,djui_hud_print_text,djui_chat_message_create,math.floor
--- @param enable boolean
--- @return nil
--- Globally enables or disables Day Night Cycle
local function enable_day_night_cycle(enable)
if not network_is_server() and not network_is_moderator() then return end
if type(enable) ~= "boolean" then return end
gGlobalSyncTable.dncEnabled = enable
djui_popup_create("Day Night Cycle has been " .. if_then_else(gGlobalSyncTable.dncEnabled, "enabled.", "disabled."), 2)
end
--- Returns whether or not DNC will display the time on the HUD
local function get_display_time()
return dncDisplayTime
end
--- @param enable boolean
--- @return nil
--- Sets whether or not DNC will display the time on the HUD
local function set_display_time(enable)
if type(enable) ~= "boolean" then return end
dncDisplayTime = enable
end
local function update()
if not gGlobalSyncTable.dncEnabled then
set_override_envfx(-1)
set_lighting_dir(1, 0)
set_lighting_dir(2, 0)
set_lighting_color(0, 255)
set_lighting_color(1, 255)
set_lighting_color(2, 255)
set_vertex_color(0, 255)
set_vertex_color(1, 255)
set_vertex_color(2, 255)
set_fog_color(0, 255)
set_fog_color(1, 255)
set_fog_color(2, 255)
set_fog_intensity(1)
return
end
time_tick()
handle_night_music()
-- spawn skyboxes
local skybox = get_skybox()
if obj_get_first_with_behavior_id(bhvSkybox) == nil and skybox ~= -1 then
if show_day_night_cycle() then
-- spawn day, sunset and night skyboxes
for i = 0, 2 do
local model = 0
if i == 0 then
model = gVanillaSkyboxModels[skybox] or E_MODEL_SKYBOX_OCEAN_SKY
else
model = if_then_else(i == 1, E_MODEL_SKYBOX_SUNSET, E_MODEL_SKYBOX_NIGHT)
end
spawn_non_sync_object(
bhvSkybox,
model,
0, 0, 0,
--- @param o Object
function(o)
o.oBehParams2ndByte = i
obj_scale(o, SKYBOX_SCALE + 1 * i)
end
)
end
else
-- spawn static skybox
spawn_non_sync_object(
bhvSkybox,
gVanillaSkyboxModels[skybox] or E_MODEL_SKYBOX_OCEAN_SKY,
0, 0, 0,
--- @param o Object
function(o)
o.oBehParams2ndByte = 0
obj_scale(o, SKYBOX_SCALE)
end
)
end
end
local minutes = (gGlobalSyncTable.time / MINUTE) % 24
local actSelector = obj_get_first_with_behavior_id(id_bhvActSelector)
if actSelector == nil and (show_day_night_cycle() or in_vanilla_level(LEVEL_DDD) or in_vanilla_level(LEVEL_TTM)) then -- DDD has a subarea connected by instant warps and TTM has a subarea with sunlight coming through it
-- blizzard effect at night in snow levels
if (minutes > HOUR_NIGHT_START or minutes < HOUR_SUNRISE_END) and gMarioStates[0].area.terrainType == TERRAIN_SNOW then
set_override_envfx(ENVFX_SNOW_BLIZZARD)
else
set_override_envfx(-1)
end
-- calculate lighting color
local color = COLOR_DAY
if minutes >= HOUR_SUNRISE_START and minutes <= HOUR_SUNRISE_END then
color = color_lerp(COLOR_NIGHT, COLOR_SUNRISE, (minutes - HOUR_SUNRISE_START) / HOUR_SUNRISE_DURATION)
elseif minutes >= HOUR_SUNRISE_END and minutes <= HOUR_DAY_START then
color = color_lerp(COLOR_SUNRISE, COLOR_DAY, (minutes - HOUR_SUNRISE_END) / HOUR_SUNRISE_DURATION)
elseif minutes >= HOUR_SUNSET_START and minutes <= HOUR_SUNSET_END then
color = color_lerp(COLOR_DAY, COLOR_SUNSET, (minutes - HOUR_SUNSET_START) / HOUR_SUNSET_DURATION)
elseif minutes >= HOUR_SUNSET_END and minutes <= HOUR_NIGHT_START then
color = color_lerp(COLOR_SUNSET, COLOR_NIGHT, (minutes - HOUR_SUNSET_END) / HOUR_SUNSET_DURATION)
elseif minutes > HOUR_NIGHT_START or minutes < HOUR_SUNRISE_START then
color = COLOR_NIGHT
elseif minutes > HOUR_DAY_START and minutes < HOUR_SUNSET_START then
color = COLOR_DAY
end
-- calculate fog color
local fogColor = COLOR_DAY
if minutes >= HOUR_SUNRISE_START and minutes <= HOUR_SUNRISE_END then
fogColor = color_lerp(FOG_COLOR_NIGHT, COLOR_SUNRISE, (minutes - HOUR_SUNRISE_START) / HOUR_SUNRISE_DURATION)
elseif minutes >= HOUR_SUNRISE_END and minutes <= HOUR_DAY_START then
fogColor = color_lerp(COLOR_SUNRISE, COLOR_DAY, (minutes - HOUR_SUNRISE_END) / HOUR_SUNRISE_DURATION)
elseif minutes >= HOUR_SUNSET_START and minutes <= HOUR_SUNSET_END then
fogColor = color_lerp(COLOR_DAY, COLOR_SUNSET, (minutes - HOUR_SUNSET_START) / HOUR_SUNSET_DURATION)
elseif minutes >= HOUR_SUNSET_END and minutes <= HOUR_NIGHT_START then
fogColor = color_lerp(COLOR_SUNSET, FOG_COLOR_NIGHT, (minutes - HOUR_SUNSET_END) / HOUR_SUNSET_DURATION)
elseif minutes > HOUR_NIGHT_START or minutes < HOUR_SUNRISE_START then
fogColor = FOG_COLOR_NIGHT
elseif minutes > HOUR_DAY_START and minutes < HOUR_SUNSET_START then
fogColor = COLOR_DAY
end
-- calculate lighting direction
local dir = DIR_BRIGHT
if minutes >= HOUR_SUNRISE_START and minutes <= HOUR_SUNRISE_END then
dir = lerp(DIR_DARK, DIR_BRIGHT, clampf((minutes - HOUR_SUNRISE_START) / (HOUR_SUNRISE_DURATION), 0, 1))
elseif minutes >= HOUR_SUNSET_START and minutes <= HOUR_NIGHT_START then
dir = lerp(DIR_BRIGHT, DIR_DARK, clampf((minutes - HOUR_SUNSET_START) / (HOUR_NIGHT_START - HOUR_SUNSET_START), 0, 1))
elseif minutes < HOUR_SUNRISE_START or minutes > HOUR_NIGHT_START then
dir = DIR_DARK
elseif minutes > HOUR_SUNRISE_END and minutes < HOUR_SUNSET_START then
dir = DIR_BRIGHT
end
-- calculate fog intensity
local intensity = 1
if minutes >= HOUR_SUNRISE_START and minutes <= HOUR_SUNRISE_END then
intensity = lerp(1.02, 1, clampf((minutes - HOUR_SUNRISE_START) / (HOUR_SUNRISE_DURATION), 0, 1))
elseif minutes >= HOUR_SUNSET_START and minutes <= HOUR_NIGHT_START then
intensity = lerp(1, 1.02, clampf((minutes - HOUR_SUNSET_START) / (HOUR_NIGHT_START - HOUR_SUNSET_START), 0, 1))
elseif minutes < HOUR_SUNRISE_START or minutes > HOUR_NIGHT_START then
intensity = 1.02
elseif minutes > HOUR_SUNRISE_END and minutes < HOUR_SUNSET_START then
intensity = 1
end
set_lighting_dir(1, -(1 - dir))
set_lighting_dir(2, -(1 - dir))
set_lighting_color(0, color.r)
set_lighting_color(1, color.g)
set_lighting_color(2, color.b)
set_vertex_color(0, color.r)
set_vertex_color(1, color.g)
set_vertex_color(2, color.b)
set_fog_color(0, fogColor.r)
set_fog_color(1, fogColor.g)
set_fog_color(2, fogColor.b)
set_fog_intensity(intensity)
else
set_override_envfx(-1)
set_lighting_dir(1, 0)
set_lighting_dir(2, 0)
set_lighting_color(0, 255)
set_lighting_color(1, 255)
set_lighting_color(2, 255)
set_vertex_color(0, 255)
set_vertex_color(1, 255)
set_vertex_color(2, 255)
set_fog_color(0, 255)
set_fog_color(1, 255)
set_fog_color(2, 255)
set_fog_intensity(1)
end
end
local function on_hud_render_behind()
if not gGlobalSyncTable.dncEnabled or not dncDisplayTime then return end -- api checks
if obj_get_first_with_behavior_id(id_bhvActSelector) ~= nil or gNetworkPlayers[0].currActNum == 99 then return end -- game checks
djui_hud_set_resolution(RESOLUTION_N64)
djui_hud_set_font(FONT_TINY)
local scale = 1
local text = get_time_string()
local hidden = hud_is_hidden()
local x = if_then_else(hidden, (djui_hud_get_screen_width() * 0.5) - (djui_hud_measure_text(text) * (0.5 * scale)), 24)
local y = if_then_else(hidden, (djui_hud_get_screen_height() - 20), 32)
local minutes = (gGlobalSyncTable.time / MINUTE) % 24
-- outlined text
djui_hud_set_color(0, 0, 0, 255)
djui_hud_print_text(text, x - 1, y, scale)
djui_hud_print_text(text, x + 1, y, scale)
djui_hud_print_text(text, x, y - 1, scale)
djui_hud_print_text(text, x, y + 1, scale)
if minutes >= HOUR_SUNRISE_START and minutes <= HOUR_SUNRISE_END then
local color = color_lerp(COLOR_DISPLAY_DARK, COLOR_DISPLAY_BRIGHT, (minutes - HOUR_SUNRISE_START) / HOUR_SUNRISE_DURATION)
djui_hud_set_color(color.r, color.g, color.b, 255)
elseif minutes >= HOUR_SUNSET_END and minutes <= HOUR_NIGHT_START then
local color = color_lerp(COLOR_DISPLAY_BRIGHT, COLOR_DISPLAY_DARK, (minutes - HOUR_SUNSET_END) / HOUR_SUNSET_DURATION)
djui_hud_set_color(color.r, color.g, color.b, 255)
elseif minutes > HOUR_NIGHT_START or minutes < HOUR_SUNRISE_START then
djui_hud_set_color(COLOR_DISPLAY_DARK.r, COLOR_DISPLAY_DARK.g, COLOR_DISPLAY_DARK.b, 255)
elseif minutes > HOUR_SUNRISE_END and minutes < HOUR_SUNSET_END then
djui_hud_set_color(COLOR_DISPLAY_BRIGHT.r, COLOR_DISPLAY_BRIGHT.g, COLOR_DISPLAY_BRIGHT.b, 255)
end
djui_hud_print_text(text, x, y, scale)
end
local function on_level_init()
if not gGlobalSyncTable.dncEnabled then return end
playingNightMusic = false
if gNetworkPlayers[0].currLevelNum == LEVEL_CASTLE_GROUNDS and gNetworkPlayers[0].currActNum == 99 then
if gMarioStates[0].action ~= ACT_END_WAVING_CUTSCENE then
gGlobalSyncTable.time = get_day_count() * (MINUTE * 24) + (MINUTE * (HOUR_SUNSET_START - 0.75))
gGlobalSyncTable.timeScale = 1
else
gGlobalSyncTable.time = (get_day_count() + 1) * (MINUTE * 24) + (MINUTE * HOUR_SUNRISE_END)
end
end
end
local function on_warp()
if not gGlobalSyncTable.dncEnabled then return end
if network_is_server() then save_time() end
end
local function on_exit()
if network_is_server() then save_time() end
end
local function on_set_command(msg)
if msg == "" then
djui_chat_message_create("/time \\#00ffff\\set\\#ffff00\\ [TIME]\\#dcdcdc\\ to set the time")
return true
end
if msg == "morning" then
gGlobalSyncTable.time = get_day_count() * (MINUTE * 24) + (MINUTE * 6)
elseif msg == "day" or msg == "noon" then
gGlobalSyncTable.time = get_day_count() * (MINUTE * 24) + (MINUTE * 12)
elseif msg == "night" then
gGlobalSyncTable.time = get_day_count() * (MINUTE * 24) + (MINUTE * 21)
elseif msg == "midnight" then
gGlobalSyncTable.time = get_day_count() * (MINUTE * 24)
elseif msg == "sunrise" then
gGlobalSyncTable.time = get_day_count() * (MINUTE * 24) + (MINUTE * 5)
elseif msg == "sunset" then
gGlobalSyncTable.time = get_day_count() * (MINUTE * 24) + (MINUTE * 20)
else
local amount = tonumber(msg)
if amount ~= nil then
gGlobalSyncTable.time = amount * SECOND
end
end
djui_chat_message_create("Time set to " .. math_floor(gGlobalSyncTable.time / SECOND))
if network_is_server() then save_time() end
end
local function on_add_command(msg)
local amount = tonumber(msg)
if amount == nil then
djui_chat_message_create("/time \\#00ffff\\add\\#ffff00\\ [AMOUNT]\\#dcdcdc\\ to add to the time")
return
end
gGlobalSyncTable.time = gGlobalSyncTable.time + (amount * SECOND)
djui_chat_message_create("[Day Night Cycle] Time set to " .. math_floor(gGlobalSyncTable.time / SECOND))
if network_is_server() then save_time() end
end
local function on_scale_command(msg)
local scale = tonumber(msg)
if scale == nil then
djui_chat_message_create("/time \\#00ffff\\scale\\#ffff00\\ [SCALE]\\#dcdcdc\\ to scale the rate at which time passes")
return
end
gGlobalSyncTable.timeScale = scale
djui_chat_message_create("[Day Night Cycle] Time scale set to " .. scale)
if network_is_server() then save_time() end
end
local function on_query_command()
djui_chat_message_create(string.format("Time is %d (%s), day %d", math_floor(gGlobalSyncTable.time / SECOND), get_time_string(), get_day_count()))
end
local function on_24h_command()
use24h = not use24h
mod_storage_save_bool("24h", use24h)
end
local function on_sync_command()
djui_chat_message_create("[Day Night Cycle] Attempting to sync in-game time with real world time...")
local dateTime = get_date_and_time()
gGlobalSyncTable.time = get_day_count() * (MINUTE * 24) + (MINUTE * dateTime.hour) + (SECOND * dateTime.minute)
gGlobalSyncTable.timeScale = REAL_MINUTE
if network_is_server() then save_time() end
end
local function on_time_command(msg)
local args = split(msg)
local perms = network_is_server() or network_is_moderator()
if args[1] == "set" then
if not perms then
djui_chat_message_create("\\#d86464\\[Day Night Cycle] You do not have permission to run /time set")
else
on_set_command(args[2] or "")
end
elseif args[1] == "add" then
if not perms then
djui_chat_message_create("\\#d86464\\[Day Night Cycle] You do not have permission to run /time add")
else
on_add_command(args[2] or "")
end
elseif args[1] == "scale" then
if not perms then
djui_chat_message_create("\\#d86464\\[Day Night Cycle] You do not have permission to run /time scale")
else
on_scale_command(args[2] or "")
end
elseif args[1] == "query" then
on_query_command()
elseif args[1] == "24h" then
on_24h_command()
elseif args[1] == "sync" then
if not perms then
djui_chat_message_create("\\#d86464\\[Day Night Cycle] You do not have permission to run /time sync")
else
on_sync_command()
end
else
if not perms then
djui_chat_message_create("\\#d86464\\[Day Night Cycle] You do not have permission to enable or disable Day Night Cycle")
else
gGlobalSyncTable.dncEnabled = not gGlobalSyncTable.dncEnabled
djui_chat_message_create("[Day Night Cycle] Status: " .. on_or_off(gGlobalSyncTable.dncEnabled))
end
end
return true
end
_G.dayNightCycleApi = {
enable_day_night_cycle = enable_day_night_cycle,
get_display_time = get_display_time,
set_display_time = set_display_time,
get_day_count = get_day_count,
get_time_string = get_time_string,
get_raw_time = get_raw_time,
set_raw_time = set_raw_time,
}
night_music_register(SEQ_LEVEL_GRASS, "03_level_grass")
night_music_register(SEQ_LEVEL_WATER, "05_level_water")
night_music_register(SEQ_LEVEL_HOT, "06_level_hot")
night_music_register(SEQ_LEVEL_SNOW, "08_level_snow")
hook_event(HOOK_UPDATE, update)
hook_event(HOOK_ON_HUD_RENDER_BEHIND, on_hud_render_behind)
hook_event(HOOK_ON_LEVEL_INIT, on_level_init)
hook_event(HOOK_ON_WARP, on_warp)
hook_event(HOOK_ON_EXIT, on_exit)
hook_chat_command("time", "\\#00ffff\\[set|add|scale|query|24h|sync]\\#7f7f7f\\ (leave blank to toggle Day Night Cycle on or off)", on_time_command)

View file

@ -0,0 +1,129 @@
if SM64COOPDX_VERSION == nil then return end
local SKYBOX_DAY = 0
local SKYBOX_SUNSET = 1
local SKYBOX_NIGHT = 2
-- standard skyboxes
E_MODEL_SKYBOX_OCEAN_SKY = smlua_model_util_get_id("skybox_ocean_sky_geo")
local E_MODEL_SKYBOX_FLAMING_SKY = smlua_model_util_get_id("skybox_flaming_sky_geo")
local E_MODEL_SKYBOX_UNDERWATER_CITY = smlua_model_util_get_id("skybox_underwater_city_geo")
local E_MODEL_SKYBOX_BELOW_CLOUDS = smlua_model_util_get_id("skybox_below_clouds_geo")
local E_MODEL_SKYBOX_SNOW_MOUNTAINS = smlua_model_util_get_id("skybox_snow_mountains_geo")
local E_MODEL_SKYBOX_DESERT = smlua_model_util_get_id("skybox_desert_geo")
local E_MODEL_SKYBOX_HAUNTED = smlua_model_util_get_id("skybox_haunted_geo")
local E_MODEL_SKYBOX_GREEN_SKY = smlua_model_util_get_id("skybox_green_sky_geo")
local E_MODEL_SKYBOX_ABOVE_CLOUDS = smlua_model_util_get_id("skybox_above_clouds_geo")
local E_MODEL_SKYBOX_PURPLE_SKY = smlua_model_util_get_id("skybox_purple_sky_geo")
local E_MODEL_SKYBOX_SUNRISE = smlua_model_util_get_id("skybox_sunrise_geo")
E_MODEL_SKYBOX_SUNSET = smlua_model_util_get_id("skybox_sunset_geo")
E_MODEL_SKYBOX_NIGHT = smlua_model_util_get_id("skybox_night_geo")
-- below clouds skyboxes
local E_MODEL_SKYBOX_BELOW_CLOUDS_NIGHT = smlua_model_util_get_id("skybox_below_clouds_night_geo")
local E_MODEL_SKYBOX_BELOW_CLOUDS_SUNRISE = smlua_model_util_get_id("skybox_below_clouds_sunrise_geo")
local E_MODEL_SKYBOX_BELOW_CLOUDS_SUNSET = smlua_model_util_get_id("skybox_below_clouds_sunset_geo")
gVanillaSkyboxModels = {
[BACKGROUND_OCEAN_SKY] = E_MODEL_SKYBOX_OCEAN_SKY,
[BACKGROUND_FLAMING_SKY] = E_MODEL_SKYBOX_FLAMING_SKY,
[BACKGROUND_UNDERWATER_CITY] = E_MODEL_SKYBOX_UNDERWATER_CITY,
[BACKGROUND_BELOW_CLOUDS] = E_MODEL_SKYBOX_BELOW_CLOUDS,
[BACKGROUND_SNOW_MOUNTAINS] = E_MODEL_SKYBOX_SNOW_MOUNTAINS,
[BACKGROUND_DESERT] = E_MODEL_SKYBOX_DESERT,
[BACKGROUND_HAUNTED] = E_MODEL_SKYBOX_HAUNTED,
[BACKGROUND_GREEN_SKY] = E_MODEL_SKYBOX_GREEN_SKY,
[BACKGROUND_ABOVE_CLOUDS] = E_MODEL_SKYBOX_ABOVE_CLOUDS,
[BACKGROUND_PURPLE_SKY] = E_MODEL_SKYBOX_PURPLE_SKY
}
-- localize functions to improve performance
local get_skybox,obj_set_model_extended,set_override_far,obj_mark_for_deletion,vec3f_to_object_pos,clampf,cur_obj_hide,cur_obj_unhide = get_skybox,obj_set_model_extended,set_override_far,obj_mark_for_deletion,vec3f_to_object_pos,clampf,cur_obj_hide,cur_obj_unhide
--- @param o Object
function bhv_skybox_init(o)
o.header.gfx.skipInViewCheck = true
local skybox = get_skybox()
if o.oBehParams2ndByte == SKYBOX_DAY then
obj_set_model_extended(o, gVanillaSkyboxModels[skybox] or E_MODEL_SKYBOX_OCEAN_SKY)
elseif o.oBehParams2ndByte == SKYBOX_NIGHT then
obj_set_model_extended(o, if_then_else(skybox == BACKGROUND_BELOW_CLOUDS, E_MODEL_SKYBOX_BELOW_CLOUDS_NIGHT, E_MODEL_SKYBOX_NIGHT))
end
set_override_far(100000)
end
--- @param o Object
function bhv_skybox_loop(o)
if not gGlobalSyncTable.dncEnabled then
obj_mark_for_deletion(o)
return
end
vec3f_to_object_pos(o, gLakituState.pos)
local skybox = get_skybox()
-- do not rotate BITDW skybox
if skybox == BACKGROUND_GREEN_SKY then return end
local minutes = (gGlobalSyncTable.time / MINUTE) % 24
if o.oBehParams2ndByte ~= SKYBOX_SUNSET then
o.oFaceAngleYaw = gGlobalSyncTable.time * 2
else
if minutes < 12 then
o.oFaceAngleYaw = 0
else
o.oFaceAngleYaw = 0x8000
end
end
if o.oBehParams2ndByte == SKYBOX_DAY then
if minutes >= HOUR_SUNRISE_END and minutes <= HOUR_DAY_START then
o.oOpacity = lerp_round(0, 255, clampf((minutes - HOUR_SUNRISE_END) / HOUR_SUNSET_DURATION, 0, 1))
elseif minutes >= HOUR_SUNSET_START and minutes <= HOUR_SUNSET_END then
o.oOpacity = lerp_round(255, 0, clampf((minutes - HOUR_SUNSET_START) / HOUR_SUNSET_DURATION, 0, 1))
elseif minutes < HOUR_SUNRISE_END or minutes > HOUR_NIGHT_START then
o.oOpacity = 0
elseif minutes > HOUR_DAY_START and minutes < HOUR_SUNSET_START then
o.oOpacity = 255
end
elseif o.oBehParams2ndByte == SKYBOX_SUNSET then
if minutes >= HOUR_SUNRISE_START and minutes <= HOUR_SUNRISE_END then
o.oOpacity = lerp_round(0, 255, clampf((minutes - HOUR_SUNRISE_START) / HOUR_SUNRISE_DURATION, 0, 1))
elseif minutes >= HOUR_SUNRISE_END and minutes <= HOUR_DAY_START then
o.oOpacity = lerp_round(255, 0, clampf((minutes - HOUR_SUNRISE_END) / HOUR_SUNRISE_DURATION, 0, 1))
elseif minutes >= HOUR_SUNSET_START and minutes <= HOUR_SUNSET_END then
o.oOpacity = lerp_round(0, 255, clampf((minutes - HOUR_SUNSET_START) / HOUR_SUNSET_DURATION, 0, 1))
elseif minutes >= HOUR_SUNSET_END and minutes <= HOUR_NIGHT_START then
o.oOpacity = 255
else
o.oOpacity = 0
end
if minutes < 12 then
obj_set_model_extended(o, if_then_else(skybox == BACKGROUND_BELOW_CLOUDS, E_MODEL_SKYBOX_BELOW_CLOUDS_SUNRISE, E_MODEL_SKYBOX_SUNRISE))
else
obj_set_model_extended(o, if_then_else(skybox == BACKGROUND_BELOW_CLOUDS, E_MODEL_SKYBOX_BELOW_CLOUDS_SUNSET, E_MODEL_SKYBOX_SUNSET))
end
elseif o.oBehParams2ndByte == SKYBOX_NIGHT then
if minutes >= HOUR_SUNRISE_START and minutes <= HOUR_SUNRISE_END then
o.oOpacity = lerp_round(255, 0, clampf((minutes - HOUR_SUNRISE_START) / HOUR_SUNRISE_DURATION, 0, 1))
elseif minutes >= HOUR_SUNSET_END and minutes <= HOUR_NIGHT_START then
o.oOpacity = lerp_round(0, 255, clampf((minutes - HOUR_SUNSET_END) / HOUR_SUNSET_DURATION, 0, 1))
elseif minutes > HOUR_SUNRISE_END and minutes < HOUR_SUNSET_END then
o.oOpacity = 0
elseif minutes > HOUR_NIGHT_START or minutes < HOUR_SUNRISE_START then
o.oOpacity = 255
end
end
if o.oOpacity == 0 then
cur_obj_hide()
else
cur_obj_unhide()
end
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,49 @@
if SM64COOPDX_VERSION == nil then
local first = false
hook_event(HOOK_ON_LEVEL_INIT, function()
if not first then
first = true
play_sound(SOUND_MENU_CAMERA_BUZZ, { x = 0, y = 0, z = 0 })
djui_chat_message_create("\\#ff7f7f\\Gun Mod is no longer supported with sm64ex-coop as it uses sm64coopdx exclusive Lua functionality.\n\\#dcdcdc\\To play this mod, try out sm64coopdx, at\n\\#7f7fff\\https://sm64coopdx.com")
end
end)
return
end
-- models
E_MODEL_BULLET_HOLE = smlua_model_util_get_id("bullet_hole_geo")
E_MODEL_SINGLE_ARM = smlua_model_util_get_id("arm_geo")
E_MODEL_PISTOL = smlua_model_util_get_id("pistol_geo")
E_MODEL_MAGNUM = smlua_model_util_get_id("magnum_geo")
E_MODEL_AK47 = smlua_model_util_get_id("ak47_geo")
E_MODEL_SHOTGUN = smlua_model_util_get_id("shotgun_geo")
E_MODEL_ARROW = smlua_model_util_get_id("arrow_geo")
E_MODEL_TROLL_EXPLOSION = smlua_model_util_get_id("troll_explosion_geo")
-- textures
TEX_CROSSHAIR = get_texture_info("gun_mod_crosshair")
-- custom sounds
SOUND_CUSTOM_IMPACT = audio_sample_load("impact.mp3")
SOUND_CUSTOM_RICOCHET = audio_sample_load("ricochet.mp3")
SOUND_CUSTOM_DRY = audio_sample_load("dry.mp3")
SOUND_CUSTOM_BAD_TO_THE_BONE = audio_sample_load("bad_to_the_bone_riff.mp3")
-- actions
-- ACT_CUSTOM_MOVEMENT = allocate_mario_action(ACT_GROUP_CUTSCENE)
-- packet ids
PACKET_ATTACK = 0
PACKET_SOUND = 1
-- misc
START_IN_FIRST_PERSON = true
MAX_INVENTORY_SLOTS = 2
HEALTH_SIGN = 30
HEALTH_BREAKABLE_BOX = 30
HEALTH_BOWLING_BALL = 75
HEALTH_CHUCKYA = 60
HEALTH_KING_BOBOMB = 200
HEALTH_BOWSER = 300

228
mods/gun-mod/a-utils.lua Normal file
View file

@ -0,0 +1,228 @@
if SM64COOPDX_VERSION == nil then return end
define_custom_obj_fields({
oGmHealth = "f32"
})
--- @return number
--- Gets the player's health in 0-100 format
function get_health()
return clampf((gMarioStates[0].health - 0xFF) / (0x880 - 0xFF), 0, 1) * 100
end
--- @return nil
--- Sets the player's health in 0-100 format
function set_health(health)
gMarioStates[0].health = (health * 19.21) + 0xFF
end
function packet_send(reliable, packet, dataTable)
dataTable.packet = packet
dataTable.level = gNetworkPlayers[0].currLevelNum
dataTable.area = gNetworkPlayers[0].currAreaIndex
dataTable.act = gNetworkPlayers[0].currActNum
network_send(reliable, dataTable)
on_packet_receive(dataTable)
end
------------------
-- synced audio --
------------------
gSoundTable = {}
local soundId = -1
function sync_audio_sample_load(filename)
local sound = audio_sample_load(filename)
if sound ~= nil then
soundId = soundId + 1
gSoundTable["snd" .. soundId] = sound
return "snd" .. soundId
end
return nil
end
function sync_audio_sample_play(audio, position, volume)
local packet = {
sound = audio,
x = position.x,
y = position.y,
z = position.z,
volume = volume
}
packet_send(false, PACKET_SOUND, packet)
end
--------------------
-- misc functions --
--------------------
--- @param m MarioState
function active_player(m)
local np = gNetworkPlayers[m.playerIndex]
if m.playerIndex == 0 then
return 1
end
if not np.connected then
return 0
end
if np.currCourseNum ~= gNetworkPlayers[0].currCourseNum then
return 0
end
if np.currActNum ~= gNetworkPlayers[0].currActNum then
return 0
end
if np.currLevelNum ~= gNetworkPlayers[0].currLevelNum then
return 0
end
if np.currAreaIndex ~= gNetworkPlayers[0].currAreaIndex then
return 0
end
return is_player_active(m)
end
function if_then_else(cond, ifTrue, ifFalse)
if cond then return ifTrue end
return ifFalse
end
function handle_timer(timer)
if timer > 0 then
timer = timer - 1
end
return timer
end
function split(s)
local result = {}
for match in (s):gmatch(string.format("[^%s]+", " ")) do
table.insert(result, match)
end
return result
end
function on_or_off(value)
if value then return "\\#00ff00\\ON" end
return "\\#ff0000\\OFF"
end
function name_without_hex(name)
local s = ''
local inSlash = false
for i = 1, #name do
local c = name:sub(i,i)
if c == '\\' then
inSlash = not inSlash
elseif not inSlash then
s = s .. c
end
end
return s
end
function lerp(a,b,t) return a * (1-t) + b * t end
--- @param obj Object
function obj_set_animation(obj, name)
if obj == nil then return end
local animPointer = nil
if obj.header.gfx.animInfo.curAnim ~= nil then animPointer = obj.header.gfx.animInfo.curAnim._pointer end
smlua_anim_util_set_animation(obj, name)
if obj.header.gfx.animInfo.curAnim._pointer ~= animPointer then
obj.header.gfx.animInfo.animAccel = 0
obj.header.gfx.animInfo.animFrame = obj.header.gfx.animInfo.curAnim.startFrame
end
end
--- @param o1 Object
--- @param o2 Object
--- Basically `obj_check_hitbox_overlap()` except it uses 3 variables for object 1's X, Y and Z coordinates
function obj_check_hitbox_overlap_xyz(o1, o2, x2, y2, z2)
if o1 == nil or o2 == nil then return false end
local o1H = maxf(o1.hitboxHeight, o1.hurtboxHeight) -- object 1 hitbox height
local o1R = maxf(o1.hitboxRadius, o1.hurtboxRadius) -- object 1 hitbox radius
local o2H = maxf(o2.hitboxHeight, o2.hurtboxHeight) -- object 2 hitbox height
local o2R = maxf(o2.hitboxRadius, o2.hurtboxRadius) -- object 2 hitbox radius
-- calculate the distance between the cylinder centers in the xz-plane
local distanceXZ = math.sqrt(sqrf(x2 - o1.oPosX) + sqrf(z2 - o1.oPosZ))
-- check for collision in the xz-plane (ignoring height)
if distanceXZ <= o1R + o2R then
-- check for collision in the y-axis (height)
if math.abs(y2 - o1.oPosY) <= maxf(o1H, o2H) * 0.5 then
return true
end
end
return false
end
--- @param obj Object
function obj_skip_in_view_check(obj)
obj.header.gfx.skipInViewCheck = true
end
-- generic
function obj_generate_hitbox_multiply_func(radius, height)
--- @param o Object
local func = function(o)
o.hitboxRadius = o.hitboxRadius * radius
o.hitboxHeight = o.hitboxHeight * height
end
return func
end
-- generic
function obj_generate_health_func(health)
--- @param o Object
local func = function(o)
o.oGmHealth = health
end
return func
end
--- @param o Object
function obj_sign_hitbox(o)
o.hitboxRadius = o.hitboxRadius * 0.75
o.hitboxHeight = o.hitboxHeight * 1.5
o.oGmHealth = HEALTH_SIGN
end
--- @param o Object
function obj_amp_hitbox(o)
if o.oAction ~= AMP_ACT_ATTACK_COOLDOWN then
o.hitboxHeight = o.hitboxHeight * 2
end
end
--- @param o Object
function obj_chuckya_hitbox(o)
o.hitboxHeight = o.hitboxHeight * 2
o.oGmHealth = HEALTH_CHUCKYA
end
--- @param o Object
function obj_snufit_hitbox(o)
o.hitboxRadius = o.hitboxRadius * 0.6
o.hitboxHeight = o.hitboxHeight * 2
o.hitboxDownOffset = 60
end
--- @param o Object
function obj_king_bobomb_hitbox(o)
o.oGmHealth = HEALTH_KING_BOBOMB
o.hitboxHeight = o.hitboxHeight * 3
end
function gm_hook_behavior(id, override, init, loop)
hook_behavior(
id,
get_object_list_from_behavior(get_behavior_from_id(id)), -- automatically get the correct object list
override, init, loop,
"bhvGm" .. get_behavior_name_from_id(id):sub(4) -- give the behavior a consistent behavior name (for example, bhvGoomba will become bhvGmGoomba)
)
end

View file

@ -0,0 +1,24 @@
#include "src/game/envfx_snow.h"
const GeoLayout ak47_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_SCALE(LAYER_FORCE, 65536),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_set_player_colors),
GEO_ASM(8, geo_mario_set_player_colors),
GEO_SWITCH_CASE(0, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, -45, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 25, 0, 0, ak47_Arm_mesh_layer_1),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, ak47_material_revert_render_settings),
GEO_CLOSE_NODE(),
GEO_END(),
};

View file

@ -0,0 +1,25 @@
extern const GeoLayout ak47_geo[];
extern Lights1 ak47_wood_lights;
extern Lights1 ak47_gray_lights;
extern Lights1 ak47_darkgray_lights;
extern Lights1 ak47_darkergray_lights;
extern u8 ak47_wood_rgba16[];
extern u8 ak47_noise_i8[];
extern Vtx ak47_Arm_mesh_layer_1_vtx_0[101];
extern Gfx ak47_Arm_mesh_layer_1_tri_0[];
extern Vtx ak47_Arm_mesh_layer_1_vtx_1[226];
extern Gfx ak47_Arm_mesh_layer_1_tri_1[];
extern Vtx ak47_Arm_mesh_layer_1_vtx_2[4];
extern Gfx ak47_Arm_mesh_layer_1_tri_2[];
extern Vtx ak47_Arm_mesh_layer_1_vtx_3[71];
extern Gfx ak47_Arm_mesh_layer_1_tri_3[];
extern Vtx ak47_Arm_mesh_layer_1_vtx_4[60];
extern Gfx ak47_Arm_mesh_layer_1_tri_4[];
extern Gfx mat_ak47_wood[];
extern Gfx mat_ak47_gray[];
extern Gfx mat_ak47_black_layer1[];
extern Gfx mat_revert_ak47_black_layer1[];
extern Gfx mat_ak47_darkgray[];
extern Gfx mat_ak47_darkergray[];
extern Gfx ak47_Arm_mesh_layer_1[];
extern Gfx ak47_material_revert_render_settings[];

View file

@ -0,0 +1,905 @@
Lights1 ak47_wood_lights = gdSPDefLights1(
0x7F, 0x7F, 0x7F,
0xFF, 0xFF, 0xFF, 0x28, 0x28, 0x28);
Lights1 ak47_gray_lights = gdSPDefLights1(
0x53, 0x53, 0x53,
0xAA, 0xAA, 0xAA, 0x28, 0x28, 0x28);
Lights1 ak47_darkgray_lights = gdSPDefLights1(
0x3B, 0x3B, 0x3B,
0x7C, 0x7C, 0x7C, 0x28, 0x28, 0x28);
Lights1 ak47_darkergray_lights = gdSPDefLights1(
0xF, 0xF, 0xF,
0x2A, 0x2A, 0x2A, 0x28, 0x28, 0x28);
Gfx ak47_wood_rgba16_aligner[] = {gsSPEndDisplayList()};
u8 ak47_wood_rgba16[] = {
#include "actors/ak47/wood.rgba16.inc.c"
};
Gfx ak47_noise_i8_aligner[] = {gsSPEndDisplayList()};
u8 ak47_noise_i8[] = {
#include "actors/ak47/noise.i8.inc.c"
};
Vtx ak47_Arm_mesh_layer_1_vtx_0[101] = {
{{ {119, 40, -12}, 0, {-197, 504}, {161, 28, 176, 255} }},
{{ {119, 22, -12}, 0, {-197, 1006}, {177, 179, 194, 255} }},
{{ {121, 22, 1}, 0, {165, 1006}, {200, 179, 84, 255} }},
{{ {120, 45, -2}, 0, {75, 365}, {188, 89, 59, 255} }},
{{ {121, 40, 1}, 0, {165, 504}, {191, 28, 105, 255} }},
{{ {119, 45, -9}, 0, {-107, 365}, {173, 89, 220, 255} }},
{{ {119, 22, -12}, 0, {165, -639}, {177, 179, 194, 255} }},
{{ {143, 25, -15}, 0, {144, -1330}, {0, 167, 165, 255} }},
{{ {168, 28, -13}, 0, {-16, -2021}, {86, 163, 242, 255} }},
{{ {121, 22, 1}, 0, {-197, -639}, {200, 179, 84, 255} }},
{{ {145, 25, -4}, 0, {-176, -1330}, {28, 167, 86, 255} }},
{{ {143, 25, -15}, 0, {63, -1330}, {0, 167, 165, 255} }},
{{ {119, 22, -12}, 0, {-14, -639}, {177, 179, 194, 255} }},
{{ {119, 40, -12}, 0, {488, -639}, {161, 28, 176, 255} }},
{{ {167, 34, -18}, 0, {309, -2021}, {72, 231, 154, 255} }},
{{ {167, 40, -18}, 0, {488, -2021}, {68, 29, 153, 255} }},
{{ {119, 40, -12}, 0, {488, -639}, {161, 28, 176, 255} }},
{{ {119, 45, -9}, 0, {627, -639}, {173, 89, 220, 255} }},
{{ {167, 40, -18}, 0, {488, -2021}, {68, 29, 153, 255} }},
{{ {168, 44, -16}, 0, {585, -2021}, {72, 88, 199, 255} }},
{{ {143, 25, -15}, 0, {63, -1330}, {0, 167, 165, 255} }},
{{ {167, 34, -18}, 0, {309, -2021}, {72, 231, 154, 255} }},
{{ {168, 28, -13}, 0, {140, -2021}, {86, 163, 242, 255} }},
{{ {168, 28, -13}, 0, {-172, -2021}, {86, 163, 242, 255} }},
{{ {169, 34, -8}, 0, {-341, -2021}, {100, 231, 74, 255} }},
{{ {145, 25, -4}, 0, {-95, -1330}, {28, 167, 86, 255} }},
{{ {169, 40, -8}, 0, {-520, -2021}, {97, 29, 77, 255} }},
{{ {121, 22, 1}, 0, {-18, -639}, {200, 179, 84, 255} }},
{{ {121, 40, 1}, 0, {-520, -639}, {191, 28, 105, 255} }},
{{ {120, 45, -2}, 0, {-659, -639}, {188, 89, 59, 255} }},
{{ {169, 44, -11}, 0, {-617, -2021}, {86, 88, 32, 255} }},
{{ {169, 34, -8}, 0, {-154, 683}, {100, 231, 74, 255} }},
{{ {168, 28, -13}, 0, {-16, 852}, {86, 163, 242, 255} }},
{{ {167, 34, -18}, 0, {122, 683}, {72, 231, 154, 255} }},
{{ {169, 44, -11}, 0, {-85, 407}, {86, 88, 32, 255} }},
{{ {167, 40, -18}, 0, {122, 504}, {68, 29, 153, 255} }},
{{ {168, 44, -16}, 0, {53, 407}, {72, 88, 199, 255} }},
{{ {169, 40, -8}, 0, {-154, 504}, {97, 29, 77, 255} }},
{{ {169, 44, -11}, 0, {53, -2021}, {86, 88, 32, 255} }},
{{ {119, 45, -9}, 0, {-107, -639}, {173, 89, 220, 255} }},
{{ {120, 45, -2}, 0, {75, -639}, {188, 89, 59, 255} }},
{{ {168, 44, -16}, 0, {-85, -2021}, {72, 88, 199, 255} }},
{{ {70, 22, 0}, 0, {-16, 768}, {84, 225, 166, 255} }},
{{ {42, 0, 3}, 0, {-640, 1553}, {153, 24, 186, 255} }},
{{ {53, 22, 3}, 0, {-16, 1248}, {171, 43, 172, 255} }},
{{ {57, -10, 0}, 0, {-937, 1115}, {39, 168, 173, 255} }},
{{ {42, -8, 3}, 0, {-855, 1553}, {166, 190, 195, 255} }},
{{ {57, -10, 0}, 0, {95, 1929}, {39, 168, 173, 255} }},
{{ {70, 22, 0}, 0, {43, 1008}, {84, 225, 166, 255} }},
{{ {70, 22, 4}, 0, {-75, 1008}, {108, 225, 60, 255} }},
{{ {59, -10, 8}, 0, {-127, 1929}, {62, 168, 67, 255} }},
{{ {43, 0, 11}, 0, {95, 1632}, {179, 24, 98, 255} }},
{{ {54, 22, 7}, 0, {43, 1008}, {201, 43, 106, 255} }},
{{ {53, 22, 3}, 0, {-75, 1008}, {171, 43, 172, 255} }},
{{ {42, 0, 3}, 0, {-127, 1632}, {153, 24, 186, 255} }},
{{ {42, -8, 3}, 0, {-127, 1847}, {166, 190, 195, 255} }},
{{ {43, -8, 11}, 0, {95, 1847}, {190, 190, 86, 255} }},
{{ {43, 0, 11}, 0, {608, 1553}, {179, 24, 98, 255} }},
{{ {70, 22, 4}, 0, {-16, 768}, {108, 225, 60, 255} }},
{{ {54, 22, 7}, 0, {-16, 1248}, {201, 43, 106, 255} }},
{{ {59, -10, 8}, 0, {905, 1115}, {62, 168, 67, 255} }},
{{ {43, -8, 11}, 0, {823, 1553}, {190, 190, 86, 255} }},
{{ {57, -10, 0}, 0, {95, 1115}, {39, 168, 173, 255} }},
{{ {59, -10, 8}, 0, {-127, 1115}, {62, 168, 67, 255} }},
{{ {43, -8, 11}, 0, {-127, 1553}, {190, 190, 86, 255} }},
{{ {42, -8, 3}, 0, {95, 1553}, {166, 190, 195, 255} }},
{{ {51, 22, 5}, 0, {-16, 1317}, {202, 141, 8, 255} }},
{{ {52, 38, 10}, 0, {-449, 1317}, {228, 66, 105, 255} }},
{{ {31, 31, 14}, 0, {-263, 1902}, {22, 69, 105, 255} }},
{{ {18, 11, 13}, 0, {314, 2254}, {44, 167, 79, 255} }},
{{ {22, 33, 15}, 0, {-329, 2171}, {18, 90, 87, 255} }},
{{ {-21, 27, 22}, 0, {-159, 3377}, {184, 56, 89, 255} }},
{{ {-15, -1, 18}, 0, {643, 3190}, {218, 162, 76, 255} }},
{{ {51, 22, 5}, 0, {-16, 1317}, {202, 141, 8, 255} }},
{{ {30, 31, 4}, 0, {231, 1902}, {245, 69, 150, 255} }},
{{ {50, 38, 0}, 0, {417, 1317}, {197, 66, 165, 255} }},
{{ {18, 11, 8}, 0, {-346, 2254}, {18, 167, 167, 255} }},
{{ {20, 33, 5}, 0, {297, 2171}, {246, 90, 167, 255} }},
{{ {20, 33, 5}, 0, {297, 2171}, {246, 90, 167, 255} }},
{{ {18, 11, 8}, 0, {-346, 2254}, {18, 167, 167, 255} }},
{{ {-22, 27, 12}, 0, {127, 3377}, {161, 56, 194, 255} }},
{{ {-15, -1, 13}, 0, {-675, 3190}, {196, 162, 195, 255} }},
{{ {51, 22, 5}, 0, {-16, 1317}, {202, 141, 8, 255} }},
{{ {18, 11, 13}, 0, {-87, 2254}, {44, 167, 79, 255} }},
{{ {18, 11, 8}, 0, {55, 2254}, {18, 167, 167, 255} }},
{{ {-15, -1, 13}, 0, {55, 3190}, {196, 162, 195, 255} }},
{{ {-15, -1, 18}, 0, {-87, 3190}, {218, 162, 76, 255} }},
{{ {-22, 27, 12}, 0, {-158, 3377}, {161, 56, 194, 255} }},
{{ {-21, 27, 22}, 0, {126, 3377}, {184, 56, 89, 255} }},
{{ {22, 33, 15}, 0, {126, 2171}, {18, 90, 87, 255} }},
{{ {20, 33, 5}, 0, {-158, 2171}, {246, 90, 167, 255} }},
{{ {30, 31, 4}, 0, {-158, 1902}, {245, 69, 150, 255} }},
{{ {31, 31, 14}, 0, {126, 1902}, {22, 69, 105, 255} }},
{{ {50, 38, 0}, 0, {-158, 1317}, {197, 66, 165, 255} }},
{{ {50, 38, 0}, 0, {-158, 1317}, {197, 66, 165, 255} }},
{{ {31, 31, 14}, 0, {126, 1902}, {22, 69, 105, 255} }},
{{ {52, 38, 10}, 0, {126, 1317}, {228, 66, 105, 255} }},
{{ {-22, 27, 12}, 0, {-158, 865}, {161, 56, 194, 255} }},
{{ {-15, -1, 18}, 0, {55, 1667}, {218, 162, 76, 255} }},
{{ {-21, 27, 22}, 0, {126, 865}, {184, 56, 89, 255} }},
{{ {-15, -1, 13}, 0, {-87, 1667}, {196, 162, 195, 255} }},
};
Gfx ak47_Arm_mesh_layer_1_tri_0[] = {
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_0 + 0, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(2, 4, 3, 0),
gsSP1Triangle(3, 5, 0, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(8, 9, 6, 0),
gsSP1Triangle(8, 10, 9, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSP1Triangle(13, 14, 11, 0),
gsSP1Triangle(13, 15, 14, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_0 + 16, 15, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 2, 1, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(9, 8, 10, 0),
gsSP1Triangle(10, 11, 9, 0),
gsSP1Triangle(10, 12, 11, 0),
gsSP1Triangle(12, 10, 13, 0),
gsSP1Triangle(14, 13, 10, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_0 + 31, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 0, 2, 0),
gsSP1Triangle(2, 4, 3, 0),
gsSP1Triangle(4, 5, 3, 0),
gsSP1Triangle(3, 6, 0, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(7, 10, 8, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSP1Triangle(12, 11, 14, 0),
gsSP1Triangle(15, 12, 14, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_0 + 47, 15, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 6, 7, 0),
gsSP1Triangle(8, 4, 7, 0),
gsSP1Triangle(8, 9, 4, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(11, 10, 13, 0),
gsSP1Triangle(14, 13, 10, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_0 + 62, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(6, 7, 4, 0),
gsSP1Triangle(8, 7, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(10, 7, 9, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSP1Triangle(14, 12, 11, 0),
gsSP1Triangle(14, 15, 12, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_0 + 78, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 2, 1, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(7, 6, 5, 0),
gsSP1Triangle(7, 5, 8, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(9, 11, 12, 0),
gsSP1Triangle(11, 13, 12, 0),
gsSP1Triangle(11, 14, 13, 0),
gsSP1Triangle(15, 13, 14, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_0 + 94, 7, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(3, 6, 4, 0),
gsSPEndDisplayList(),
};
Vtx ak47_Arm_mesh_layer_1_vtx_1[226] = {
{{ {218, 32, -19}, 0, {-85, 746}, {125, 0, 236, 255} }},
{{ {218, 29, -20}, 0, {-37, 828}, {125, 0, 236, 255} }},
{{ {218, 35, -20}, 0, {-37, 664}, {125, 0, 236, 255} }},
{{ {218, 29, -24}, 0, {58, 828}, {125, 0, 236, 255} }},
{{ {217, 32, -25}, 0, {105, 746}, {125, 0, 236, 255} }},
{{ {218, 35, -24}, 0, {58, 664}, {125, 0, 236, 255} }},
{{ {52, 22, 10}, 0, {126, 1008}, {195, 183, 84, 255} }},
{{ {52, 38, 10}, 0, {126, 575}, {228, 66, 105, 255} }},
{{ {51, 22, 5}, 0, {-16, 1008}, {202, 141, 8, 255} }},
{{ {50, 22, 0}, 0, {-158, 1008}, {172, 183, 195, 255} }},
{{ {50, 38, 0}, 0, {-158, 575}, {197, 66, 165, 255} }},
{{ {90, 36, 4}, 0, {126, 218}, {0, 127, 0, 255} }},
{{ {98, 36, 8}, 0, {277, 24}, {0, 127, 0, 255} }},
{{ {95, 36, 1}, 0, {65, 71}, {0, 127, 0, 255} }},
{{ {90, 34, 4}, 0, {-158, 218}, {0, 129, 0, 255} }},
{{ {95, 34, 1}, 0, {-97, 71}, {0, 129, 0, 255} }},
{{ {98, 34, 8}, 0, {-309, 24}, {0, 129, 0, 255} }},
{{ {193, 37, -16}, 0, {9, 582}, {131, 0, 20, 255} }},
{{ {193, 39, -17}, 0, {-17, 538}, {131, 0, 20, 255} }},
{{ {193, 39, -19}, 0, {-68, 538}, {131, 0, 20, 255} }},
{{ {193, 36, -19}, 0, {-68, 627}, {131, 0, 20, 255} }},
{{ {193, 37, -20}, 0, {-94, 582}, {131, 0, 20, 255} }},
{{ {193, 36, -17}, 0, {-17, 627}, {131, 0, 20, 255} }},
{{ {156, 39, -13}, 0, {-68, -1673}, {246, 110, 193, 255} }},
{{ {156, 39, -11}, 0, {-17, -1673}, {10, 110, 63, 255} }},
{{ {193, 39, -17}, 0, {-17, -2728}, {10, 110, 63, 255} }},
{{ {193, 39, -19}, 0, {-68, -2728}, {246, 110, 193, 255} }},
{{ {156, 39, -11}, 0, {-486, -1673}, {10, 110, 63, 255} }},
{{ {193, 37, -16}, 0, {-442, -2728}, {20, 0, 125, 255} }},
{{ {193, 39, -17}, 0, {-486, -2728}, {10, 110, 63, 255} }},
{{ {156, 39, -11}, 0, {-486, -1673}, {10, 110, 63, 255} }},
{{ {156, 37, -10}, 0, {-442, -1673}, {20, 0, 125, 255} }},
{{ {193, 37, -16}, 0, {-442, -2728}, {20, 0, 125, 255} }},
{{ {193, 36, -17}, 0, {-397, -2728}, {10, 146, 63, 255} }},
{{ {156, 36, -11}, 0, {-397, -1673}, {10, 146, 63, 255} }},
{{ {193, 35, -16}, 0, {5, 664}, {131, 0, 20, 255} }},
{{ {193, 37, -15}, 0, {53, 582}, {131, 0, 20, 255} }},
{{ {193, 40, -16}, 0, {5, 500}, {131, 0, 20, 255} }},
{{ {192, 37, -21}, 0, {-137, 582}, {131, 0, 20, 255} }},
{{ {193, 40, -20}, 0, {-90, 500}, {131, 0, 20, 255} }},
{{ {193, 35, -20}, 0, {-90, 664}, {131, 0, 20, 255} }},
{{ {193, 32, -15}, 0, {53, 746}, {131, 0, 20, 255} }},
{{ {193, 29, -20}, 0, {-90, 828}, {131, 0, 20, 255} }},
{{ {192, 32, -21}, 0, {-137, 746}, {131, 0, 20, 255} }},
{{ {193, 29, -16}, 0, {5, 828}, {131, 0, 20, 255} }},
{{ {193, 35, -16}, 0, {-360, -2728}, {17, 192, 109, 255} }},
{{ {206, 35, -18}, 0, {-360, -3083}, {17, 192, 109, 255} }},
{{ {206, 37, -17}, 0, {-442, -3083}, {17, 192, 109, 255} }},
{{ {193, 37, -15}, 0, {-442, -2728}, {17, 192, 109, 255} }},
{{ {218, 35, -20}, 0, {-360, -3439}, {17, 64, 109, 255} }},
{{ {206, 35, -18}, 0, {-360, -3083}, {17, 64, 109, 255} }},
{{ {193, 35, -16}, 0, {-360, -2728}, {17, 64, 109, 255} }},
{{ {218, 32, -19}, 0, {-278, -3439}, {17, 64, 109, 255} }},
{{ {193, 32, -15}, 0, {-278, -2728}, {17, 64, 109, 255} }},
{{ {192, 37, -21}, 0, {410, -2728}, {239, 192, 147, 255} }},
{{ {205, 35, -22}, 0, {328, -3083}, {239, 192, 147, 255} }},
{{ {193, 35, -20}, 0, {328, -2728}, {239, 192, 147, 255} }},
{{ {205, 37, -23}, 0, {410, -3083}, {239, 192, 147, 255} }},
{{ {193, 35, -20}, 0, {328, -2728}, {239, 64, 147, 255} }},
{{ {205, 35, -22}, 0, {328, -3083}, {239, 64, 147, 255} }},
{{ {218, 35, -24}, 0, {328, -3439}, {239, 64, 147, 255} }},
{{ {218, 35, -24}, 0, {328, -3439}, {239, 64, 147, 255} }},
{{ {192, 32, -21}, 0, {246, -2728}, {239, 64, 147, 255} }},
{{ {193, 35, -20}, 0, {328, -2728}, {239, 64, 147, 255} }},
{{ {217, 32, -25}, 0, {246, -3439}, {239, 64, 147, 255} }},
{{ {193, 40, -16}, 0, {5, -2728}, {0, 127, 0, 255} }},
{{ {206, 40, -18}, 0, {5, -3083}, {0, 127, 0, 255} }},
{{ {205, 40, -22}, 0, {-90, -3083}, {0, 127, 0, 255} }},
{{ {193, 40, -20}, 0, {-90, -2728}, {0, 127, 0, 255} }},
{{ {193, 37, -15}, 0, {-442, -2728}, {17, 64, 109, 255} }},
{{ {206, 40, -18}, 0, {-524, -3083}, {17, 64, 109, 255} }},
{{ {193, 40, -16}, 0, {-524, -2728}, {17, 64, 109, 255} }},
{{ {206, 37, -17}, 0, {-442, -3083}, {17, 64, 109, 255} }},
{{ {156, 36, -11}, 0, {-15, -1673}, {10, 146, 63, 255} }},
{{ {193, 36, -19}, 0, {36, -2728}, {246, 146, 193, 255} }},
{{ {193, 36, -17}, 0, {-15, -2728}, {10, 146, 63, 255} }},
{{ {156, 36, -13}, 0, {36, -1673}, {246, 146, 193, 255} }},
{{ {156, 36, -13}, 0, {365, -1673}, {246, 146, 193, 255} }},
{{ {193, 37, -20}, 0, {410, -2728}, {236, 0, 131, 255} }},
{{ {193, 36, -19}, 0, {365, -2728}, {246, 146, 193, 255} }},
{{ {156, 37, -14}, 0, {410, -1673}, {236, 0, 131, 255} }},
{{ {193, 39, -19}, 0, {454, -2728}, {246, 110, 193, 255} }},
{{ {156, 39, -13}, 0, {454, -1673}, {246, 110, 193, 255} }},
{{ {156, 30, -13}, 0, {201, -1673}, {246, 146, 193, 255} }},
{{ {193, 32, -20}, 0, {246, -2728}, {236, 0, 131, 255} }},
{{ {193, 30, -19}, 0, {201, -2728}, {246, 146, 193, 255} }},
{{ {156, 32, -14}, 0, {246, -1673}, {236, 0, 131, 255} }},
{{ {156, 33, -13}, 0, {290, -1673}, {246, 110, 193, 255} }},
{{ {193, 33, -19}, 0, {290, -2728}, {246, 110, 193, 255} }},
{{ {156, 30, -11}, 0, {-15, -1673}, {10, 146, 63, 255} }},
{{ {156, 30, -13}, 0, {36, -1673}, {246, 146, 193, 255} }},
{{ {193, 30, -19}, 0, {36, -2728}, {246, 146, 193, 255} }},
{{ {193, 30, -17}, 0, {-15, -2728}, {10, 146, 63, 255} }},
{{ {156, 32, -10}, 0, {-278, -1673}, {20, 0, 125, 255} }},
{{ {156, 30, -11}, 0, {-233, -1673}, {10, 146, 63, 255} }},
{{ {193, 30, -17}, 0, {-233, -2728}, {10, 146, 63, 255} }},
{{ {193, 32, -16}, 0, {-278, -2728}, {20, 0, 125, 255} }},
{{ {156, 33, -11}, 0, {-322, -1673}, {10, 110, 63, 255} }},
{{ {193, 33, -17}, 0, {-322, -2728}, {10, 110, 63, 255} }},
{{ {193, 29, -20}, 0, {58, -2728}, {0, 129, 0, 255} }},
{{ {218, 29, -24}, 0, {58, -3439}, {0, 129, 0, 255} }},
{{ {218, 29, -20}, 0, {-37, -3439}, {0, 129, 0, 255} }},
{{ {193, 29, -16}, 0, {-37, -2728}, {0, 129, 0, 255} }},
{{ {193, 29, -20}, 0, {164, -2728}, {239, 192, 147, 255} }},
{{ {192, 32, -21}, 0, {246, -2728}, {239, 192, 147, 255} }},
{{ {217, 32, -25}, 0, {246, -3439}, {239, 192, 147, 255} }},
{{ {218, 29, -24}, 0, {164, -3439}, {239, 192, 147, 255} }},
{{ {193, 40, -20}, 0, {492, -2728}, {239, 64, 147, 255} }},
{{ {205, 37, -23}, 0, {410, -3083}, {239, 64, 147, 255} }},
{{ {192, 37, -21}, 0, {410, -2728}, {239, 64, 147, 255} }},
{{ {205, 40, -22}, 0, {492, -3083}, {239, 64, 147, 255} }},
{{ {205, 37, -22}, 0, {58, 583}, {125, 0, 236, 255} }},
{{ {205, 37, -23}, 0, {105, 582}, {125, 0, 236, 255} }},
{{ {205, 40, -22}, 0, {58, 500}, {125, 0, 236, 255} }},
{{ {205, 35, -22}, 0, {58, 664}, {125, 0, 236, 255} }},
{{ {211, 49, -23}, 0, {-90, 251}, {154, 74, 16, 255} }},
{{ {205, 40, -22}, 0, {-90, 500}, {154, 74, 16, 255} }},
{{ {206, 40, -18}, 0, {5, 500}, {154, 74, 16, 255} }},
{{ {212, 49, -19}, 0, {5, 251}, {154, 74, 16, 255} }},
{{ {193, 32, -15}, 0, {-278, -2728}, {17, 192, 109, 255} }},
{{ {193, 29, -16}, 0, {-196, -2728}, {17, 192, 109, 255} }},
{{ {218, 29, -20}, 0, {-196, -3439}, {17, 192, 109, 255} }},
{{ {218, 32, -19}, 0, {-278, -3439}, {17, 192, 109, 255} }},
{{ {206, 40, -18}, 0, {-37, 500}, {125, 0, 236, 255} }},
{{ {206, 37, -17}, 0, {-85, 582}, {125, 0, 236, 255} }},
{{ {206, 35, -18}, 0, {-37, 664}, {125, 0, 236, 255} }},
{{ {206, 37, -18}, 0, {-37, 583}, {125, 0, 236, 255} }},
{{ {206, 35, -18}, 0, {-360, -3083}, {20, 0, 125, 255} }},
{{ {218, 35, -20}, 0, {-360, -3439}, {20, 0, 125, 255} }},
{{ {218, 37, -20}, 0, {-441, -3439}, {20, 0, 125, 255} }},
{{ {209, 37, -19}, 0, {-441, -3165}, {20, 0, 125, 255} }},
{{ {215, 37, -20}, 0, {-441, -3357}, {20, 0, 125, 255} }},
{{ {218, 49, -20}, 0, {-773, -3439}, {20, 0, 125, 255} }},
{{ {215, 46, -20}, 0, {-691, -3357}, {20, 0, 125, 255} }},
{{ {213, 46, -20}, 0, {-691, -3303}, {20, 0, 125, 255} }},
{{ {212, 49, -19}, 0, {-773, -3261}, {20, 0, 125, 255} }},
{{ {206, 37, -18}, 0, {-441, -3083}, {20, 0, 125, 255} }},
{{ {206, 40, -18}, 0, {-524, -3083}, {20, 0, 125, 255} }},
{{ {209, 39, -19}, 0, {-498, -3165}, {20, 0, 125, 255} }},
{{ {218, 35, -24}, 0, {328, -3439}, {236, 0, 131, 255} }},
{{ {205, 35, -22}, 0, {328, -3083}, {236, 0, 131, 255} }},
{{ {205, 37, -22}, 0, {409, -3083}, {236, 0, 131, 255} }},
{{ {208, 37, -22}, 0, {409, -3165}, {236, 0, 131, 255} }},
{{ {205, 40, -22}, 0, {492, -3083}, {236, 0, 131, 255} }},
{{ {208, 39, -22}, 0, {466, -3165}, {236, 0, 131, 255} }},
{{ {213, 46, -23}, 0, {659, -3303}, {236, 0, 131, 255} }},
{{ {211, 49, -23}, 0, {741, -3261}, {236, 0, 131, 255} }},
{{ {218, 49, -24}, 0, {741, -3439}, {236, 0, 131, 255} }},
{{ {215, 46, -23}, 0, {659, -3357}, {236, 0, 131, 255} }},
{{ {215, 37, -23}, 0, {409, -3357}, {236, 0, 131, 255} }},
{{ {218, 37, -24}, 0, {409, -3439}, {236, 0, 131, 255} }},
{{ {212, 49, -19}, 0, {5, -3261}, {0, 127, 0, 255} }},
{{ {218, 49, -20}, 0, {5, -3439}, {0, 127, 0, 255} }},
{{ {218, 49, -24}, 0, {-90, -3439}, {0, 127, 0, 255} }},
{{ {211, 49, -23}, 0, {-90, -3261}, {0, 127, 0, 255} }},
{{ {218, 37, -24}, 0, {58, 583}, {125, 0, 236, 255} }},
{{ {218, 49, -24}, 0, {58, 251}, {125, 0, 236, 255} }},
{{ {218, 49, -20}, 0, {-37, 251}, {125, 0, 236, 255} }},
{{ {218, 37, -20}, 0, {-37, 583}, {125, 0, 236, 255} }},
{{ {218, 35, -24}, 0, {58, 664}, {125, 0, 236, 255} }},
{{ {218, 35, -20}, 0, {-37, 664}, {125, 0, 236, 255} }},
{{ {209, 37, -19}, 0, {5, -3165}, {0, 127, 0, 255} }},
{{ {215, 37, -20}, 0, {5, -3357}, {0, 127, 0, 255} }},
{{ {215, 37, -23}, 0, {-90, -3357}, {0, 127, 0, 255} }},
{{ {208, 37, -22}, 0, {-90, -3165}, {0, 127, 0, 255} }},
{{ {209, 39, -19}, 0, {-37, 526}, {125, 0, 236, 255} }},
{{ {209, 37, -19}, 0, {-37, 583}, {125, 0, 236, 255} }},
{{ {208, 37, -22}, 0, {58, 583}, {125, 0, 236, 255} }},
{{ {208, 39, -22}, 0, {58, 526}, {125, 0, 236, 255} }},
{{ {215, 37, -20}, 0, {5, 583}, {131, 0, 20, 255} }},
{{ {215, 46, -23}, 0, {-90, 333}, {131, 0, 20, 255} }},
{{ {215, 37, -23}, 0, {-90, 583}, {131, 0, 20, 255} }},
{{ {215, 46, -20}, 0, {5, 333}, {131, 0, 20, 255} }},
{{ {213, 46, -20}, 0, {-37, 333}, {102, 182, 240, 255} }},
{{ {209, 39, -19}, 0, {-37, 526}, {102, 182, 240, 255} }},
{{ {208, 39, -22}, 0, {58, 526}, {102, 182, 240, 255} }},
{{ {213, 46, -23}, 0, {58, 333}, {102, 182, 240, 255} }},
{{ {215, 46, -20}, 0, {-37, -3357}, {0, 129, 0, 255} }},
{{ {213, 46, -20}, 0, {-37, -3303}, {0, 129, 0, 255} }},
{{ {213, 46, -23}, 0, {58, -3303}, {0, 129, 0, 255} }},
{{ {215, 46, -23}, 0, {58, -3357}, {0, 129, 0, 255} }},
{{ {156, 33, -13}, 0, {-68, -1673}, {246, 110, 193, 255} }},
{{ {193, 33, -17}, 0, {-17, -2728}, {10, 110, 63, 255} }},
{{ {193, 33, -19}, 0, {-68, -2728}, {246, 110, 193, 255} }},
{{ {156, 33, -11}, 0, {-17, -1673}, {10, 110, 63, 255} }},
{{ {51, 22, 5}, 0, {-16, 1317}, {202, 141, 8, 255} }},
{{ {50, 22, 0}, 0, {126, 1317}, {172, 183, 195, 255} }},
{{ {89, 22, -6}, 0, {126, 203}, {245, 165, 168, 255} }},
{{ {52, 22, 10}, 0, {-158, 1317}, {195, 183, 84, 255} }},
{{ {91, 22, 4}, 0, {-158, 203}, {17, 165, 87, 255} }},
{{ {139, 26, -4}, 0, {-158, -1178}, {21, 168, 90, 255} }},
{{ {138, 26, -13}, 0, {126, -1178}, {248, 168, 164, 255} }},
{{ {52, 38, 10}, 0, {-449, 1317}, {228, 66, 105, 255} }},
{{ {52, 22, 10}, 0, {-16, 1317}, {195, 183, 84, 255} }},
{{ {91, 22, 4}, 0, {-16, 203}, {17, 165, 87, 255} }},
{{ {139, 38, -4}, 0, {-449, -1178}, {19, 27, 122, 255} }},
{{ {139, 26, -4}, 0, {-117, -1178}, {21, 168, 90, 255} }},
{{ {139, 44, -6}, 0, {-617, -1178}, {11, 107, 68, 255} }},
{{ {57, 44, 7}, 0, {-617, 1149}, {229, 107, 63, 255} }},
{{ {50, 38, 0}, 0, {-158, 1317}, {197, 66, 165, 255} }},
{{ {52, 38, 10}, 0, {126, 1317}, {228, 66, 105, 255} }},
{{ {57, 44, 7}, 0, {48, 1149}, {229, 107, 63, 255} }},
{{ {56, 44, 2}, 0, {-80, 1149}, {211, 107, 205, 255} }},
{{ {139, 44, -6}, 0, {48, -1178}, {11, 107, 68, 255} }},
{{ {138, 44, -11}, 0, {-80, -1178}, {245, 107, 188, 255} }},
{{ {138, 26, -13}, 0, {85, -1178}, {248, 168, 164, 255} }},
{{ {89, 22, -6}, 0, {-16, 203}, {245, 165, 168, 255} }},
{{ {50, 22, 0}, 0, {-16, 1317}, {172, 183, 195, 255} }},
{{ {138, 38, -13}, 0, {417, -1178}, {237, 27, 134, 255} }},
{{ {50, 38, 0}, 0, {417, 1317}, {197, 66, 165, 255} }},
{{ {56, 44, 2}, 0, {585, 1149}, {211, 107, 205, 255} }},
{{ {138, 44, -11}, 0, {585, -1178}, {245, 107, 188, 255} }},
{{ {90, 36, 4}, 0, {375, 218}, {190, 0, 148, 255} }},
{{ {95, 36, 1}, 0, {375, 71}, {190, 0, 148, 255} }},
{{ {95, 34, 1}, 0, {305, 71}, {190, 0, 148, 255} }},
{{ {90, 36, 4}, 0, {375, 218}, {190, 0, 148, 255} }},
{{ {95, 34, 1}, 0, {305, 71}, {190, 0, 148, 255} }},
{{ {90, 34, 4}, 0, {305, 218}, {190, 0, 148, 255} }},
{{ {98, 36, 8}, 0, {-407, 24}, {195, 0, 111, 255} }},
{{ {90, 36, 4}, 0, {-407, 218}, {195, 0, 111, 255} }},
{{ {90, 34, 4}, 0, {-337, 218}, {195, 0, 111, 255} }},
{{ {98, 34, 8}, 0, {-337, 24}, {195, 0, 111, 255} }},
{{ {95, 36, 1}, 0, {-97, 617}, {118, 0, 209, 255} }},
{{ {98, 36, 8}, 0, {-309, 617}, {118, 0, 209, 255} }},
{{ {98, 34, 8}, 0, {-309, 687}, {118, 0, 209, 255} }},
{{ {95, 34, 1}, 0, {-97, 687}, {118, 0, 209, 255} }},
};
Gfx ak47_Arm_mesh_layer_1_tri_1[] = {
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 0, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(9, 8, 10, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 14, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(6, 3, 5, 0),
gsSP1Triangle(5, 7, 6, 0),
gsSP1Triangle(6, 8, 3, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(9, 11, 12, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 30, 15, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(1, 3, 2, 0),
gsSP1Triangle(1, 4, 3, 0),
gsSP1Triangle(5, 6, 7, 0),
gsSP1Triangle(7, 8, 5, 0),
gsSP1Triangle(7, 9, 8, 0),
gsSP1Triangle(8, 10, 5, 0),
gsSP1Triangle(11, 5, 10, 0),
gsSP1Triangle(12, 11, 10, 0),
gsSP1Triangle(10, 13, 12, 0),
gsSP1Triangle(12, 14, 11, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 45, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(6, 7, 4, 0),
gsSP1Triangle(6, 8, 7, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(9, 12, 10, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 61, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 3, 1, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 6, 7, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 11, 9, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 15, 13, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 77, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 3, 1, 0),
gsSP1Triangle(3, 4, 1, 0),
gsSP1Triangle(3, 5, 4, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 9, 7, 0),
gsSP1Triangle(7, 9, 10, 0),
gsSP1Triangle(7, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 93, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 0, 3, 0),
gsSP1Triangle(4, 3, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 8, 9, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 12, 13, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 107, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 3, 1, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 7, 5, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 123, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(7, 4, 6, 0),
gsSP1Triangle(6, 8, 7, 0),
gsSP1Triangle(8, 6, 9, 0),
gsSP1Triangle(10, 8, 9, 0),
gsSP1Triangle(11, 10, 9, 0),
gsSP1Triangle(9, 12, 11, 0),
gsSP1Triangle(12, 13, 11, 0),
gsSP1Triangle(12, 14, 13, 0),
gsSP1Triangle(13, 15, 11, 0),
gsSP1Triangle(13, 7, 15, 0),
gsSP1Triangle(7, 13, 4, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 139, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 0, 2, 0),
gsSP1Triangle(3, 2, 4, 0),
gsSP1Triangle(5, 3, 4, 0),
gsSP1Triangle(6, 5, 4, 0),
gsSP1Triangle(4, 7, 6, 0),
gsSP1Triangle(7, 8, 6, 0),
gsSP1Triangle(8, 9, 6, 0),
gsSP1Triangle(8, 10, 9, 0),
gsSP1Triangle(8, 11, 10, 0),
gsSP1Triangle(10, 11, 0, 0),
gsSP1Triangle(3, 10, 0, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 155, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(2, 3, 0, 0),
gsSP1Triangle(4, 0, 3, 0),
gsSP1Triangle(3, 5, 4, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 8, 9, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 12, 13, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 169, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 3, 1, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 6, 7, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 15, 13, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 185, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 0, 2, 0),
gsSP1Triangle(2, 4, 3, 0),
gsSP1Triangle(5, 4, 2, 0),
gsSP1Triangle(5, 2, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(9, 10, 7, 0),
gsSP1Triangle(9, 11, 10, 0),
gsSP1Triangle(7, 10, 12, 0),
gsSP1Triangle(7, 12, 13, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 199, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(3, 2, 4, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(8, 9, 6, 0),
gsSP1Triangle(8, 10, 9, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(9, 11, 12, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_1 + 215, 11, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(3, 5, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(7, 9, 10, 0),
gsSPEndDisplayList(),
};
Vtx ak47_Arm_mesh_layer_1_vtx_2[4] = {
{{ {218, 29, -20}, 0, {-37, 828}, {125, 0, 236, 255} }},
{{ {218, 29, -24}, 0, {58, 828}, {125, 0, 236, 255} }},
{{ {218, 35, -20}, 0, {-37, 664}, {125, 0, 236, 255} }},
{{ {218, 35, -24}, 0, {58, 664}, {125, 0, 236, 255} }},
};
Gfx ak47_Arm_mesh_layer_1_tri_2[] = {
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_2 + 0, 4, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 2, 1, 0),
gsSPEndDisplayList(),
};
Vtx ak47_Arm_mesh_layer_1_vtx_3[71] = {
{{ {73, 18, 1}, 0, {-125, 678}, {183, 188, 177, 255} }},
{{ {75, 15, 1}, 0, {-218, 619}, {183, 188, 177, 255} }},
{{ {72, 18, 2}, 0, {-125, 724}, {183, 188, 177, 255} }},
{{ {75, 15, 1}, 0, {-10, 1210}, {106, 68, 239, 255} }},
{{ {73, 18, 1}, 0, {21, 1117}, {106, 68, 239, 255} }},
{{ {73, 18, 3}, 0, {-40, 1117}, {106, 68, 239, 255} }},
{{ {75, 15, 1}, 0, {186, 619}, {211, 188, 97, 255} }},
{{ {73, 18, 3}, 0, {93, 678}, {211, 188, 97, 255} }},
{{ {72, 18, 2}, 0, {93, 724}, {211, 188, 97, 255} }},
{{ {70, 14, 4}, 0, {-67, 768}, {0, 129, 0, 255} }},
{{ {70, 14, 1}, 0, {35, 768}, {0, 129, 0, 255} }},
{{ {79, 14, -1}, 0, {35, 512}, {0, 129, 0, 255} }},
{{ {79, 14, 3}, 0, {-67, 512}, {0, 129, 0, 255} }},
{{ {67, 18, 5}, 0, {35, 1136}, {166, 167, 14, 255} }},
{{ {70, 14, 1}, 0, {-67, 1238}, {166, 167, 14, 255} }},
{{ {70, 14, 4}, 0, {35, 1238}, {166, 167, 14, 255} }},
{{ {67, 18, 5}, 0, {35, 1136}, {166, 167, 14, 255} }},
{{ {66, 18, 1}, 0, {-67, 1136}, {166, 167, 14, 255} }},
{{ {70, 14, 1}, 0, {-67, 1238}, {166, 167, 14, 255} }},
{{ {70, 15, 2}, 0, {-16, 760}, {7, 118, 45, 255} }},
{{ {70, 14, 4}, 0, {35, 768}, {7, 118, 45, 255} }},
{{ {79, 14, 3}, 0, {35, 512}, {7, 118, 45, 255} }},
{{ {79, 15, 1}, 0, {-16, 522}, {7, 118, 45, 255} }},
{{ {67, 18, 3}, 0, {-16, 1128}, {91, 83, 32, 255} }},
{{ {67, 18, 5}, 0, {-67, 1136}, {91, 83, 32, 255} }},
{{ {70, 14, 4}, 0, {-67, 1238}, {91, 83, 32, 255} }},
{{ {70, 15, 2}, 0, {-16, 1218}, {91, 83, 32, 255} }},
{{ {79, 14, 3}, 0, {-67, 1238}, {97, 176, 241, 255} }},
{{ {79, 14, -1}, 0, {35, 1238}, {97, 176, 241, 255} }},
{{ {82, 18, -1}, 0, {35, 1136}, {97, 176, 241, 255} }},
{{ {82, 18, 2}, 0, {-67, 1136}, {97, 176, 241, 255} }},
{{ {79, 15, 1}, 0, {-16, 1218}, {172, 75, 60, 255} }},
{{ {79, 14, 3}, 0, {35, 1238}, {172, 75, 60, 255} }},
{{ {82, 18, 2}, 0, {35, 1136}, {172, 75, 60, 255} }},
{{ {81, 18, 1}, 0, {-16, 1129}, {172, 75, 60, 255} }},
{{ {70, 14, 1}, 0, {-67, 768}, {249, 118, 211, 255} }},
{{ {79, 15, 1}, 0, {-16, 522}, {249, 118, 211, 255} }},
{{ {79, 14, -1}, 0, {-67, 512}, {249, 118, 211, 255} }},
{{ {70, 15, 2}, 0, {-16, 760}, {249, 118, 211, 255} }},
{{ {79, 14, -1}, 0, {-67, 1238}, {158, 75, 225, 255} }},
{{ {79, 15, 1}, 0, {-16, 1218}, {158, 75, 225, 255} }},
{{ {81, 18, 1}, 0, {-16, 1129}, {158, 75, 225, 255} }},
{{ {82, 18, -1}, 0, {-67, 1136}, {158, 75, 225, 255} }},
{{ {66, 18, 1}, 0, {35, 1136}, {77, 83, 197, 255} }},
{{ {67, 18, 3}, 0, {-16, 1128}, {77, 83, 197, 255} }},
{{ {70, 15, 2}, 0, {-16, 1218}, {77, 83, 197, 255} }},
{{ {70, 14, 1}, 0, {35, 1238}, {77, 83, 197, 255} }},
{{ {82, 18, -1}, 0, {-67, 1136}, {132, 0, 229, 255} }},
{{ {81, 18, 1}, 0, {-16, 1129}, {132, 0, 229, 255} }},
{{ {81, 25, 1}, 0, {-16, 944}, {132, 0, 229, 255} }},
{{ {82, 25, -1}, 0, {-67, 944}, {132, 0, 229, 255} }},
{{ {81, 18, 1}, 0, {-16, 1129}, {146, 0, 64, 255} }},
{{ {82, 18, 2}, 0, {35, 1136}, {146, 0, 64, 255} }},
{{ {82, 25, 2}, 0, {35, 944}, {146, 0, 64, 255} }},
{{ {81, 25, 1}, 0, {-16, 944}, {146, 0, 64, 255} }},
{{ {82, 18, 2}, 0, {-67, 1136}, {125, 0, 236, 255} }},
{{ {82, 18, -1}, 0, {35, 1136}, {125, 0, 236, 255} }},
{{ {82, 25, -1}, 0, {35, 944}, {125, 0, 236, 255} }},
{{ {82, 25, 2}, 0, {-67, 944}, {125, 0, 236, 255} }},
{{ {73, 24, 3}, 0, {-52, 678}, {203, 0, 115, 255} }},
{{ {72, 24, 2}, 0, {-52, 724}, {203, 0, 115, 255} }},
{{ {72, 18, 2}, 0, {93, 724}, {203, 0, 115, 255} }},
{{ {73, 18, 3}, 0, {93, 678}, {203, 0, 115, 255} }},
{{ {72, 24, 2}, 0, {20, 724}, {170, 0, 163, 255} }},
{{ {73, 24, 1}, 0, {20, 678}, {170, 0, 163, 255} }},
{{ {73, 18, 1}, 0, {-125, 678}, {170, 0, 163, 255} }},
{{ {72, 18, 2}, 0, {-125, 724}, {170, 0, 163, 255} }},
{{ {73, 18, 1}, 0, {21, 1117}, {125, 0, 236, 255} }},
{{ {73, 24, 1}, 0, {21, 972}, {125, 0, 236, 255} }},
{{ {73, 24, 3}, 0, {-40, 972}, {125, 0, 236, 255} }},
{{ {73, 18, 3}, 0, {-40, 1117}, {125, 0, 236, 255} }},
};
Gfx ak47_Arm_mesh_layer_1_tri_3[] = {
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_3 + 0, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(9, 11, 12, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_3 + 16, 15, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(3, 5, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(7, 9, 10, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSP1Triangle(11, 13, 14, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_3 + 31, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 7, 5, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_3 + 47, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 6, 7, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_3 + 63, 8, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 6, 7, 0),
gsSPEndDisplayList(),
};
Vtx ak47_Arm_mesh_layer_1_vtx_4[60] = {
{{ {91, 22, -4}, 0, {-13, 165}, {236, 0, 131, 255} }},
{{ {90, 28, -4}, 0, {150, 177}, {236, 0, 131, 255} }},
{{ {108, 29, -7}, 0, {185, -310}, {236, 0, 131, 255} }},
{{ {108, 24, -7}, 0, {22, -322}, {236, 0, 131, 255} }},
{{ {111, 8, -7}, 0, {-419, -402}, {236, 0, 131, 255} }},
{{ {103, -14, -6}, 0, {-1042, -187}, {236, 0, 131, 255} }},
{{ {118, -6, -8}, 0, {-813, -618}, {236, 0, 131, 255} }},
{{ {129, -17, -10}, 0, {-1108, -931}, {236, 0, 131, 255} }},
{{ {117, -29, -8}, 0, {-1454, -587}, {236, 0, 131, 255} }},
{{ {94, 3, -5}, 0, {-548, 68}, {236, 0, 131, 255} }},
{{ {91, 22, -4}, 0, {-101, 1005}, {131, 247, 20, 255} }},
{{ {91, 28, 2}, 0, {69, 842}, {131, 247, 20, 255} }},
{{ {90, 28, -4}, 0, {-101, 842}, {131, 247, 20, 255} }},
{{ {92, 22, 2}, 0, {69, 1005}, {131, 247, 20, 255} }},
{{ {108, 29, -7}, 0, {-101, -310}, {247, 127, 1, 255} }},
{{ {90, 28, -4}, 0, {-101, 177}, {247, 127, 1, 255} }},
{{ {91, 28, 2}, 0, {69, 177}, {247, 127, 1, 255} }},
{{ {109, 29, -1}, 0, {69, -310}, {247, 127, 1, 255} }},
{{ {111, 8, -7}, 0, {69, 1411}, {110, 61, 239, 255} }},
{{ {119, -6, -2}, 0, {-101, 1805}, {110, 61, 239, 255} }},
{{ {118, -6, -8}, 0, {69, 1805}, {110, 61, 239, 255} }},
{{ {112, 8, -1}, 0, {-101, 1411}, {110, 61, 239, 255} }},
{{ {119, -6, -2}, 0, {69, -618}, {86, 92, 242, 255} }},
{{ {129, -17, -10}, 0, {-101, -931}, {86, 92, 242, 255} }},
{{ {118, -6, -8}, 0, {-101, -618}, {86, 92, 242, 255} }},
{{ {130, -17, -4}, 0, {69, -931}, {86, 92, 242, 255} }},
{{ {109, 24, -1}, 0, {-101, 970}, {125, 9, 236, 255} }},
{{ {108, 24, -7}, 0, {69, 970}, {125, 9, 236, 255} }},
{{ {108, 29, -7}, 0, {69, 807}, {125, 9, 236, 255} }},
{{ {109, 29, -1}, 0, {-101, 807}, {125, 9, 236, 255} }},
{{ {91, 22, -4}, 0, {-101, 1005}, {133, 233, 20, 255} }},
{{ {94, 3, -5}, 0, {-101, 1540}, {133, 233, 20, 255} }},
{{ {95, 3, 1}, 0, {69, 1540}, {133, 233, 20, 255} }},
{{ {92, 22, 2}, 0, {69, 1005}, {133, 233, 20, 255} }},
{{ {95, 3, 1}, 0, {69, 1540}, {145, 198, 18, 255} }},
{{ {94, 3, -5}, 0, {-101, 1540}, {145, 198, 18, 255} }},
{{ {103, -14, -6}, 0, {-101, 2034}, {145, 198, 18, 255} }},
{{ {104, -14, 0}, 0, {69, 2034}, {145, 198, 18, 255} }},
{{ {103, -14, -6}, 0, {-101, 2034}, {166, 168, 14, 255} }},
{{ {117, -29, -8}, 0, {-101, 2446}, {166, 168, 14, 255} }},
{{ {118, -29, -2}, 0, {69, 2446}, {166, 168, 14, 255} }},
{{ {104, -14, 0}, 0, {69, 2034}, {166, 168, 14, 255} }},
{{ {117, -29, -8}, 0, {69, 2446}, {89, 166, 242, 255} }},
{{ {130, -17, -4}, 0, {-101, 2100}, {89, 166, 242, 255} }},
{{ {118, -29, -2}, 0, {-101, 2446}, {89, 166, 242, 255} }},
{{ {129, -17, -10}, 0, {69, 2100}, {89, 166, 242, 255} }},
{{ {118, -29, -2}, 0, {1422, -587}, {20, 0, 125, 255} }},
{{ {130, -17, -4}, 0, {1076, -931}, {20, 0, 125, 255} }},
{{ {119, -6, -2}, 0, {781, -618}, {20, 0, 125, 255} }},
{{ {112, 8, -1}, 0, {387, -402}, {20, 0, 125, 255} }},
{{ {109, 24, -1}, 0, {-54, -322}, {20, 0, 125, 255} }},
{{ {91, 28, 2}, 0, {-182, 177}, {20, 0, 125, 255} }},
{{ {109, 29, -1}, 0, {-217, -310}, {20, 0, 125, 255} }},
{{ {95, 3, 1}, 0, {516, 68}, {20, 0, 125, 255} }},
{{ {92, 22, 2}, 0, {-19, 165}, {20, 0, 125, 255} }},
{{ {104, -14, 0}, 0, {1010, -187}, {20, 0, 125, 255} }},
{{ {108, 24, -7}, 0, {69, 970}, {123, 23, 236, 255} }},
{{ {109, 24, -1}, 0, {-101, 970}, {123, 23, 236, 255} }},
{{ {112, 8, -1}, 0, {-101, 1411}, {123, 23, 236, 255} }},
{{ {111, 8, -7}, 0, {69, 1411}, {123, 23, 236, 255} }},
};
Gfx ak47_Arm_mesh_layer_1_tri_4[] = {
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_4 + 0, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(0, 3, 4, 0),
gsSP1Triangle(5, 0, 4, 0),
gsSP1Triangle(4, 6, 5, 0),
gsSP1Triangle(6, 7, 5, 0),
gsSP1Triangle(7, 8, 5, 0),
gsSP1Triangle(5, 9, 0, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 13, 11, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_4 + 14, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 7, 5, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 11, 9, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_4 + 30, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 6, 7, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 15, 13, 0),
gsSPVertex(ak47_Arm_mesh_layer_1_vtx_4 + 46, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(0, 3, 4, 0),
gsSP1Triangle(4, 5, 0, 0),
gsSP1Triangle(4, 6, 5, 0),
gsSP1Triangle(5, 7, 0, 0),
gsSP1Triangle(5, 8, 7, 0),
gsSP1Triangle(7, 9, 0, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 12, 13, 0),
gsSPEndDisplayList(),
};
Gfx mat_ak47_wood[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(ak47_wood_lights),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, ak47_wood_rgba16),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0),
gsDPLoadBlock(7, 0, 0, 1023, 256),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0),
gsDPSetTileSize(0, 0, 0, 124, 124),
gsSPEndDisplayList(),
};
Gfx mat_ak47_gray[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(ak47_gray_lights),
gsSPEndDisplayList(),
};
Gfx mat_ak47_black_layer1[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
gsDPSetRenderMode(G_RM_ZB_OPA_SURF, G_RM_ZB_OPA_SURF2),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPEndDisplayList(),
};
Gfx mat_revert_ak47_black_layer1[] = {
gsDPPipeSync(),
gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2),
gsSPEndDisplayList(),
};
Gfx mat_ak47_darkgray[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(ak47_darkgray_lights),
gsSPEndDisplayList(),
};
Gfx mat_ak47_darkergray[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(ak47_darkergray_lights),
gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b_LOAD_BLOCK, 1, ak47_noise_i8),
gsDPSetTile(G_IM_FMT_I, G_IM_SIZ_8b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0),
gsDPLoadBlock(7, 0, 0, 511, 512),
gsDPSetTile(G_IM_FMT_I, G_IM_SIZ_8b, 4, 0, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0),
gsDPSetTileSize(0, 0, 0, 124, 124),
gsSPEndDisplayList(),
};
Gfx ak47_Arm_mesh_layer_1[] = {
gsSPDisplayList(mat_ak47_wood),
gsSPDisplayList(ak47_Arm_mesh_layer_1_tri_0),
gsSPDisplayList(mat_ak47_gray),
gsSPDisplayList(ak47_Arm_mesh_layer_1_tri_1),
gsSPDisplayList(mat_ak47_black_layer1),
gsSPDisplayList(ak47_Arm_mesh_layer_1_tri_2),
gsSPDisplayList(mat_revert_ak47_black_layer1),
gsSPDisplayList(mat_ak47_darkgray),
gsSPDisplayList(ak47_Arm_mesh_layer_1_tri_3),
gsSPDisplayList(mat_ak47_darkergray),
gsSPDisplayList(ak47_Arm_mesh_layer_1_tri_4),
gsSPEndDisplayList(),
};
Gfx ak47_material_revert_render_settings[] = {
gsDPPipeSync(),
gsSPSetGeometryMode(G_LIGHTING),
gsSPClearGeometryMode(G_TEXTURE_GEN),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 0),
gsDPSetEnvColor(255, 255, 255, 255),
gsDPSetAlphaCompare(G_AC_NONE),
gsSPEndDisplayList(),
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,58 @@
#include "src/game/envfx_snow.h"
const GeoLayout arm_Metal_Arm_Armature[] = {
GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 0, -43, 0, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, -2, 0, arm_Switch_Option_Upper_Arm_Metal_mesh_layer_1),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 25, 0, 0, arm_Switch_Option_Arm_Metal_mesh_layer_1),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout arm_Vanish_Arm_Armature[] = {
GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 0, -43, 0, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, -2, 0, arm_Switch_Option_Upper_Arm_Vanish_mesh_layer_5),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 25, 0, 0, arm_Switch_Option_Arm_Vanish_mesh_layer_5),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout arm_Vanish_Metal_Armature[] = {
GEO_TRANSLATE_ROTATE(LAYER_OPAQUE, 0, -43, 0, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, -2, 0, arm_Switch_Option_Upper_Arm_Vanish_Metal_mesh_layer_5),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 25, 0, 0, arm_Switch_Option_Arm_Vanish_Metal_mesh_layer_5),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout arm_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_SCALE(LAYER_FORCE, 65536),
GEO_OPEN_NODE(),
GEO_ASM(LAYER_OPAQUE, geo_mario_set_player_colors),
GEO_ASM(LAYER_TRANSPARENT + 3, geo_mario_set_player_colors),
GEO_SWITCH_CASE(4, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, -45, 0, arm_Upper_Arm_mesh_layer_1),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 25, 0, 0, arm_Arm_mesh_layer_1),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_BRANCH(1, arm_Metal_Arm_Armature),
GEO_BRANCH(1, arm_Vanish_Arm_Armature),
GEO_BRANCH(1, arm_Vanish_Metal_Armature),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, arm_material_revert_render_settings),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, arm_material_revert_render_settings),
GEO_CLOSE_NODE(),
GEO_END(),
};

View file

@ -0,0 +1,51 @@
extern const GeoLayout arm_Metal_Arm_Armature[];
extern const GeoLayout arm_Vanish_Arm_Armature[];
extern const GeoLayout arm_Vanish_Metal_Armature[];
extern const GeoLayout arm_geo[];
extern Lights1 arm_shirt_lights;
extern Lights1 arm_gloves_lights;
extern Lights1 arm_metal_lights;
extern Lights1 arm_shirt2_lights;
extern Lights1 arm_gloves2_lights;
extern Lights1 arm_metal2_lights;
extern u8 arm_custom_mario_metal_shade_rgba16_rgba16[];
extern u8 arm_custom_mario_metal_light_rgba16_rgba16[];
extern Vtx arm_Upper_Arm_mesh_layer_1_vtx_0[32];
extern Gfx arm_Upper_Arm_mesh_layer_1_tri_0[];
extern Vtx arm_Arm_mesh_layer_1_vtx_0[36];
extern Gfx arm_Arm_mesh_layer_1_tri_0[];
extern Vtx arm_Arm_mesh_layer_1_vtx_1[16];
extern Gfx arm_Arm_mesh_layer_1_tri_1[];
extern Vtx arm_Switch_Option_Upper_Arm_Metal_mesh_layer_1_vtx_0[32];
extern Gfx arm_Switch_Option_Upper_Arm_Metal_mesh_layer_1_tri_0[];
extern Vtx arm_Switch_Option_Arm_Metal_mesh_layer_1_vtx_0[52];
extern Gfx arm_Switch_Option_Arm_Metal_mesh_layer_1_tri_0[];
extern Vtx arm_Switch_Option_Upper_Arm_Vanish_mesh_layer_5_vtx_0[32];
extern Gfx arm_Switch_Option_Upper_Arm_Vanish_mesh_layer_5_tri_0[];
extern Vtx arm_Switch_Option_Arm_Vanish_mesh_layer_5_vtx_0[36];
extern Gfx arm_Switch_Option_Arm_Vanish_mesh_layer_5_tri_0[];
extern Vtx arm_Switch_Option_Arm_Vanish_mesh_layer_5_vtx_1[16];
extern Gfx arm_Switch_Option_Arm_Vanish_mesh_layer_5_tri_1[];
extern Vtx arm_Switch_Option_Upper_Arm_Vanish_Metal_mesh_layer_5_vtx_0[32];
extern Gfx arm_Switch_Option_Upper_Arm_Vanish_Metal_mesh_layer_5_tri_0[];
extern Vtx arm_Switch_Option_Arm_Vanish_Metal_mesh_layer_5_vtx_0[52];
extern Gfx arm_Switch_Option_Arm_Vanish_Metal_mesh_layer_5_tri_0[];
extern Gfx mat_arm_shirt[];
extern Gfx mat_arm_gloves[];
extern Gfx mat_arm_metal[];
extern Gfx mat_revert_arm_metal[];
extern Gfx mat_arm_shirt2[];
extern Gfx mat_revert_arm_shirt2[];
extern Gfx mat_arm_gloves2[];
extern Gfx mat_revert_arm_gloves2[];
extern Gfx mat_arm_metal2[];
extern Gfx mat_revert_arm_metal2[];
extern Gfx arm_Upper_Arm_mesh_layer_1[];
extern Gfx arm_Arm_mesh_layer_1[];
extern Gfx arm_Switch_Option_Upper_Arm_Metal_mesh_layer_1[];
extern Gfx arm_Switch_Option_Arm_Metal_mesh_layer_1[];
extern Gfx arm_Switch_Option_Upper_Arm_Vanish_mesh_layer_5[];
extern Gfx arm_Switch_Option_Arm_Vanish_mesh_layer_5[];
extern Gfx arm_Switch_Option_Upper_Arm_Vanish_Metal_mesh_layer_5[];
extern Gfx arm_Switch_Option_Arm_Vanish_Metal_mesh_layer_5[];
extern Gfx arm_material_revert_render_settings[];

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -0,0 +1,10 @@
#include "src/game/envfx_snow.h"
const GeoLayout arrow_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_BILLBOARD_WITH_PARAMS_AND_DL(LAYER_OPAQUE, 0, 0, 0, arrow_triangle_mesh_layer_1),
GEO_DISPLAY_LIST(LAYER_OPAQUE, arrow_material_revert_render_settings),
GEO_CLOSE_NODE(),
GEO_END(),
};

View file

@ -0,0 +1,7 @@
extern const GeoLayout arrow_geo[];
extern Vtx arrow_triangle_mesh_layer_1_vtx_0[3];
extern Gfx arrow_triangle_mesh_layer_1_tri_0[];
extern Gfx mat_arrow_white[];
extern Gfx mat_revert_arrow_white[];
extern Gfx arrow_triangle_mesh_layer_1[];
extern Gfx arrow_material_revert_render_settings[];

View file

@ -0,0 +1,45 @@
Vtx arrow_triangle_mesh_layer_1_vtx_0[3] = {
{{ {-40, 58, 0}, 0, {-16, 1008}, {0, 0, 129, 255} }},
{{ {40, 58, 0}, 0, {1008, 1008}, {0, 0, 129, 255} }},
{{ {0, 0, 0}, 0, {-16, -16}, {0, 0, 129, 255} }},
};
Gfx arrow_triangle_mesh_layer_1_tri_0[] = {
gsSPVertex(arrow_triangle_mesh_layer_1_vtx_0 + 0, 3, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSPEndDisplayList(),
};
Gfx mat_arrow_white[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
gsSPClearGeometryMode(G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPEndDisplayList(),
};
Gfx mat_revert_arrow_white[] = {
gsDPPipeSync(),
gsSPSetGeometryMode(G_CULL_BACK),
gsSPEndDisplayList(),
};
Gfx arrow_triangle_mesh_layer_1[] = {
gsSPDisplayList(mat_arrow_white),
gsSPDisplayList(arrow_triangle_mesh_layer_1_tri_0),
gsSPDisplayList(mat_revert_arrow_white),
gsSPEndDisplayList(),
};
Gfx arrow_material_revert_render_settings[] = {
gsDPPipeSync(),
gsSPSetGeometryMode(G_LIGHTING),
gsSPClearGeometryMode(G_TEXTURE_GEN),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 0),
gsDPSetEnvColor(255, 255, 255, 255),
gsDPSetAlphaCompare(G_AC_NONE),
gsSPEndDisplayList(),
};

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -0,0 +1,10 @@
#include "src/game/envfx_snow.h"
const GeoLayout bullet_hole_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, bullet_hole_bullet_hole_mesh_layer_4),
GEO_DISPLAY_LIST(LAYER_ALPHA, bullet_hole_material_revert_render_settings),
GEO_CLOSE_NODE(),
GEO_END(),
};

View file

@ -0,0 +1,9 @@
extern const GeoLayout bullet_hole_geo[];
extern Lights1 bullet_hole_bullet_hole_lights;
extern u8 bullet_hole_bullet_hole_ia8[];
extern Vtx bullet_hole_bullet_hole_mesh_layer_4_vtx_0[4];
extern Gfx bullet_hole_bullet_hole_mesh_layer_4_tri_0[];
extern Gfx mat_bullet_hole_bullet_hole[];
extern Gfx mat_revert_bullet_hole_bullet_hole[];
extern Gfx bullet_hole_bullet_hole_mesh_layer_4[];
extern Gfx bullet_hole_material_revert_render_settings[];

View file

@ -0,0 +1,62 @@
Lights1 bullet_hole_bullet_hole_lights = gdSPDefLights1(
0x7F, 0x7F, 0x7F,
0xFF, 0xFF, 0xFF, 0x28, 0x28, 0x28);
Gfx bullet_hole_bullet_hole_ia8_aligner[] = {gsSPEndDisplayList()};
u8 bullet_hole_bullet_hole_ia8[] = {
#include "actors/bullet_hole/bullet_hole.ia8.inc.c"
};
Vtx bullet_hole_bullet_hole_mesh_layer_4_vtx_0[4] = {
{{ {-22, 1, 22}, 0, {-16, 2032}, {0, 127, 0, 255} }},
{{ {22, 1, 22}, 0, {2032, 2032}, {0, 127, 0, 255} }},
{{ {22, 1, -22}, 0, {2032, -16}, {0, 127, 0, 255} }},
{{ {-22, 1, -22}, 0, {-16, -16}, {0, 127, 0, 255} }},
};
Gfx bullet_hole_bullet_hole_mesh_layer_4_tri_0[] = {
gsSPVertex(bullet_hole_bullet_hole_mesh_layer_4_vtx_0 + 0, 4, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSPEndDisplayList(),
};
Gfx mat_bullet_hole_bullet_hole[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, SHADE, 0, TEXEL0, 0, ENVIRONMENT, 0),
gsSPClearGeometryMode(G_CULL_BACK),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(bullet_hole_bullet_hole_lights),
gsDPSetTextureImage(G_IM_FMT_IA, G_IM_SIZ_8b_LOAD_BLOCK, 1, bullet_hole_bullet_hole_ia8),
gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_8b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0),
gsDPLoadBlock(7, 0, 0, 2047, 256),
gsDPSetTile(G_IM_FMT_IA, G_IM_SIZ_8b, 8, 0, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 6, 0, G_TX_WRAP | G_TX_NOMIRROR, 6, 0),
gsDPSetTileSize(0, 0, 0, 252, 252),
gsSPEndDisplayList(),
};
Gfx mat_revert_bullet_hole_bullet_hole[] = {
gsDPPipeSync(),
gsSPSetGeometryMode(G_CULL_BACK),
gsSPEndDisplayList(),
};
Gfx bullet_hole_bullet_hole_mesh_layer_4[] = {
gsSPDisplayList(mat_bullet_hole_bullet_hole),
gsSPDisplayList(bullet_hole_bullet_hole_mesh_layer_4_tri_0),
gsSPDisplayList(mat_revert_bullet_hole_bullet_hole),
gsSPEndDisplayList(),
};
Gfx bullet_hole_material_revert_render_settings[] = {
gsDPPipeSync(),
gsSPSetGeometryMode(G_LIGHTING),
gsSPClearGeometryMode(G_TEXTURE_GEN),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 0),
gsDPSetEnvColor(255, 255, 255, 255),
gsDPSetAlphaCompare(G_AC_NONE),
gsSPEndDisplayList(),
};

Binary file not shown.

View file

@ -0,0 +1,24 @@
#include "src/game/envfx_snow.h"
const GeoLayout magnum_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_SCALE(LAYER_FORCE, 65536),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_set_player_colors),
GEO_ASM(8, geo_mario_set_player_colors),
GEO_SWITCH_CASE(0, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, -45, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 25, 0, 0, magnum_Arm_mesh_layer_1),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, magnum_material_revert_render_settings),
GEO_CLOSE_NODE(),
GEO_END(),
};

View file

@ -0,0 +1,18 @@
extern const GeoLayout magnum_geo[];
extern Lights1 magnum_darkergray_lights;
extern Lights1 magnum_metal_lights;
extern u8 magnum_noise_i8[];
extern u8 magnum_plat_rgba16[];
extern Vtx magnum_Arm_mesh_layer_1_vtx_0[64];
extern Gfx magnum_Arm_mesh_layer_1_tri_0[];
extern Vtx magnum_Arm_mesh_layer_1_vtx_1[8];
extern Gfx magnum_Arm_mesh_layer_1_tri_1[];
extern Vtx magnum_Arm_mesh_layer_1_vtx_2[533];
extern Gfx magnum_Arm_mesh_layer_1_tri_2[];
extern Gfx mat_magnum_darkergray[];
extern Gfx mat_magnum_black_layer1[];
extern Gfx mat_revert_magnum_black_layer1[];
extern Gfx mat_magnum_metal[];
extern Gfx mat_revert_magnum_metal[];
extern Gfx magnum_Arm_mesh_layer_1[];
extern Gfx magnum_material_revert_render_settings[];

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

View file

@ -0,0 +1,24 @@
#include "src/game/envfx_snow.h"
const GeoLayout pistol_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_SCALE(LAYER_FORCE, 65536),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_set_player_colors),
GEO_ASM(8, geo_mario_set_player_colors),
GEO_SWITCH_CASE(0, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, -45, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 25, 0, 0, pistol_Arm_mesh_layer_1),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, pistol_material_revert_render_settings),
GEO_CLOSE_NODE(),
GEO_END(),
};

View file

@ -0,0 +1,16 @@
extern const GeoLayout pistol_geo[];
extern Lights1 pistol_gray_lights;
extern Lights1 pistol_darkergray_lights;
extern u8 pistol_noise_i8[];
extern Vtx pistol_Arm_mesh_layer_1_vtx_0[174];
extern Gfx pistol_Arm_mesh_layer_1_tri_0[];
extern Vtx pistol_Arm_mesh_layer_1_vtx_1[34];
extern Gfx pistol_Arm_mesh_layer_1_tri_1[];
extern Vtx pistol_Arm_mesh_layer_1_vtx_2[6];
extern Gfx pistol_Arm_mesh_layer_1_tri_2[];
extern Gfx mat_pistol_gray[];
extern Gfx mat_pistol_darkergray[];
extern Gfx mat_pistol_black_layer1[];
extern Gfx mat_revert_pistol_black_layer1[];
extern Gfx pistol_Arm_mesh_layer_1[];
extern Gfx pistol_material_revert_render_settings[];

View file

@ -0,0 +1,575 @@
Lights1 pistol_gray_lights = gdSPDefLights1(
0x53, 0x53, 0x53,
0xAA, 0xAA, 0xAA, 0x28, 0x28, 0x28);
Lights1 pistol_darkergray_lights = gdSPDefLights1(
0xF, 0xF, 0xF,
0x2A, 0x2A, 0x2A, 0x28, 0x28, 0x28);
Gfx pistol_noise_i8_aligner[] = {gsSPEndDisplayList()};
u8 pistol_noise_i8[] = {
0xfa, 0xff, 0xf1, 0xf7, 0xf6, 0xf0, 0xff, 0xff,
0xf7, 0xf7, 0xff, 0xff, 0xdb, 0xff, 0xcc, 0xfa,
0xd1, 0xff, 0xff, 0xf5, 0xde, 0xf7, 0xe4, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xce,
0xfc, 0xf7, 0xff, 0xff, 0xe9, 0xd7, 0xff, 0xff,
0xff, 0xe3, 0xff, 0xff, 0xce, 0xff, 0xfe, 0xff,
0xff, 0xf9, 0xe2, 0xf4, 0xde, 0xf6, 0xf8, 0xff,
0xf6, 0xea, 0xf1, 0xff, 0xff, 0xf6, 0xf3, 0xdf,
0xbe, 0xff, 0xff, 0xf4, 0xee, 0xf2, 0xff, 0xff,
0xff, 0xff, 0xf9, 0xff, 0xde, 0xf7, 0xe6, 0xf9,
0xff, 0xff, 0xfc, 0xf0, 0xff, 0xeb, 0xf1, 0xff,
0xff, 0xfd, 0xea, 0xde, 0xdc, 0xec, 0xd3, 0xff,
0xff, 0xff, 0xff, 0xcd, 0xff, 0xff, 0xff, 0xc9,
0xd9, 0xf6, 0xff, 0xdc, 0xff, 0xff, 0xf7, 0xe0,
0xff, 0xd9, 0xd4, 0xff, 0xed, 0xff, 0xff, 0xff,
0xed, 0xd8, 0xff, 0xff, 0xef, 0xeb, 0xb6, 0xff,
0xf9, 0xff, 0xff, 0xf1, 0xd6, 0xe7, 0xde, 0xe9,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff,
0xd0, 0xff, 0xff, 0xff, 0xea, 0xff, 0xe3, 0xdf,
0xff, 0xff, 0xff, 0xf6, 0xff, 0xe7, 0xff, 0xff,
0xd1, 0xff, 0xeb, 0xef, 0xec, 0xfe, 0xff, 0xff,
0xff, 0xd5, 0xde, 0xff, 0xeb, 0xff, 0xfe, 0xcf,
0xff, 0xf4, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff,
0xca, 0xfd, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xda,
0xff, 0xb3, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf8, 0xf2, 0xf9, 0xe5, 0xde, 0xe0, 0xff, 0xcb,
0xf1, 0xe5, 0xed, 0xe1, 0xcb, 0xc4, 0xef, 0xd9,
0xff, 0xc1, 0xf3, 0xff, 0xf4, 0xef, 0xff, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xfb, 0xff,
0xff, 0xff, 0xfd, 0xff, 0xfc, 0xff, 0xf8, 0xff,
0xfa, 0xe9, 0xff, 0xff, 0xfe, 0xce, 0xff, 0xe8,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xc6,
0xed, 0xff, 0xff, 0xe9, 0xe4, 0xe2, 0xf3, 0xd5,
0xff, 0xff, 0xff, 0xe4, 0xf0, 0xff, 0xff, 0xff,
0xef, 0xf5, 0xf8, 0xff, 0xfa, 0xf0, 0xff, 0xc6,
0xf2, 0xff, 0xfb, 0xff, 0xfd, 0xe4, 0xff, 0xed,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0xf6, 0xff,
0xf7, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf4, 0xff, 0xf9, 0xf7, 0xff, 0xee, 0xf0, 0xf8,
0xf9, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xe0, 0xff,
0xf0, 0xfc, 0xe8, 0xff, 0xff, 0xf4, 0xff, 0xe6,
0xbc, 0xfa, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff,
0xf8, 0xd3, 0xff, 0xff, 0xe5, 0xd9, 0xf6, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf5,
0xde, 0xff, 0xee, 0xff, 0xe6, 0xe6, 0xff, 0xc9,
0xff, 0xff, 0xf2, 0xd0, 0xf4, 0xff, 0xfe, 0xe6,
0xfe, 0xd4, 0xff, 0xe8, 0xff, 0xfb, 0xff, 0xff,
0xff, 0xff, 0xd5, 0xff, 0xf9, 0xfc, 0xf3, 0xb9,
0xf9, 0xf9, 0xf9, 0xea, 0xff, 0xff, 0xff, 0xff,
0xeb, 0xf0, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd,
0xff, 0xff, 0xfe, 0xfc, 0xf3, 0xfb, 0xfd, 0xff,
0xff, 0xe9, 0xde, 0xff, 0xf2, 0xee, 0xff, 0xf4,
0xff, 0xf9, 0xff, 0xf2, 0xff, 0xf2, 0xff, 0xd2,
0xff, 0xe2, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf4, 0xd5,
0xff, 0xff, 0xe5, 0xfd, 0xeb, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe5, 0xff, 0xed, 0xff, 0xf6, 0xfb,
0xff, 0xf4, 0xf1, 0xf9, 0xd5, 0xd8, 0xff, 0xff,
0xff, 0xf5, 0xf5, 0xe2, 0xdf, 0xfd, 0xff, 0xea,
0xee, 0xff, 0xd2, 0xff, 0xff, 0xff, 0xff, 0xed,
0xff, 0xff, 0xfa, 0xe8, 0xf7, 0xcc, 0xf4, 0xef,
0xf7, 0xff, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe7, 0xff, 0xe9, 0xd5, 0xda, 0xff, 0xff, 0xf8,
0xe6, 0xf9, 0xf2, 0xfc, 0xff, 0xff, 0xff, 0xed,
0xff, 0xff, 0xf5, 0xff, 0xe0, 0xed, 0xff, 0xf4,
0xff, 0xf5, 0xff, 0xfd, 0xfa, 0xf9, 0xd6, 0xee,
0xe8, 0xff, 0xff, 0xe7, 0xed, 0xff, 0xf4, 0xfc,
0xff, 0xff, 0xfd, 0xf7, 0xff, 0xfe, 0xff, 0xf0,
0xff, 0xff, 0xef, 0xf4, 0xe3, 0xee, 0xff, 0xf5,
0xfa, 0xff, 0xff, 0xff, 0xd3, 0xd6, 0xff, 0xd3,
0xfa, 0xed, 0xf5, 0xe9, 0xff, 0xe7, 0xff, 0xa3,
0xed, 0xff, 0xfe, 0xff, 0xea, 0xff, 0xfd, 0xff,
0xf6, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xfa,
0xd8, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xdf, 0xf6,
0xff, 0xf0, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xd6,
0xff, 0xeb, 0xff, 0xf1, 0xfe, 0xff, 0xff, 0xff,
0xff, 0xef, 0xe8, 0xfe, 0xfa, 0xdc, 0xff, 0xff,
0xfc, 0xff, 0xfd, 0xff, 0xf2, 0xf0, 0xff, 0xd6,
0xff, 0xf4, 0xff, 0xe3, 0xff, 0xe6, 0xff, 0xff,
0xf7, 0xca, 0xde, 0xff, 0xf7, 0xd3, 0xff, 0xf2,
0xea, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff,
0xf9, 0xff, 0xf6, 0xf1, 0xec, 0xff, 0xff, 0xff,
0xf1, 0xfb, 0xff, 0xf8, 0xff, 0xe2, 0xff, 0xff,
0xff, 0xe6, 0xfe, 0xff, 0xe9, 0xed, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xe9,
0xe2, 0xec, 0xff, 0xff, 0xf3, 0xf9, 0xff, 0xff,
0xfc, 0xff, 0xff, 0xc4, 0xfc, 0xe6, 0xff, 0xd1,
0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xd0, 0xff,
0xff, 0xff, 0xf9, 0xff, 0xff, 0xfe, 0xff, 0xf8,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
0xff, 0xff, 0xff, 0xf0, 0xf9, 0xff, 0xff, 0xff,
0xbc, 0xff, 0xff, 0xcb, 0xff, 0xde, 0xff, 0xe7,
0xff, 0xfc, 0xff, 0xf3, 0xff, 0xeb, 0xbf, 0xff,
0xff, 0xef, 0xe7, 0xff, 0xf4, 0xff, 0xff, 0xff,
0xeb, 0xf4, 0xff, 0xec, 0xff, 0xff, 0xff, 0xed,
0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xe2, 0xff,
0xf4, 0xf0, 0xff, 0xf8, 0xff, 0xff, 0xf2, 0xff,
0xff, 0xff, 0xdf, 0xff, 0xfb, 0xff, 0xff, 0xff,
0xff, 0xea, 0xbf, 0xf7, 0xff, 0xff, 0xff, 0xde,
0xf9, 0xb3, 0xf3, 0xf1, 0xe6, 0xe4, 0xdb, 0xff,
0xf2, 0xff, 0xfd, 0xff, 0xff, 0xf3, 0xf6, 0xde,
0xff, 0xf4, 0xfa, 0xea, 0xf2, 0xf1, 0xea, 0xff,
0xea, 0xf5, 0xe8, 0xff, 0xef, 0xe8, 0xc9, 0xff,
0xff, 0xff, 0xe0, 0xed, 0xff, 0xff, 0xe5, 0xff,
0xff, 0xff, 0xf6, 0xf4, 0xe5, 0xc6, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfc, 0xba, 0xea, 0xed,
0xff, 0xfd, 0xff, 0xf9, 0xe9, 0xf8, 0xff, 0xff,
0xff, 0xfb, 0xe9, 0xff, 0xff, 0xfe, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff,
0xda, 0xdd, 0xff, 0xff, 0xff, 0xda, 0xff, 0xff,
0xff, 0xff, 0xff, 0xdd, 0xf0, 0xc7, 0xe7, 0xff,
0xf8, 0xde, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xff,
0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xec, 0xff,
0xd5, 0xfb, 0xfd, 0xff, 0xeb, 0xd9, 0xff, 0xbb,
0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfb, 0xfe, 0xec, 0xff, 0xea, 0xdd,
0xff, 0xda, 0xff, 0xe6, 0xef, 0xff, 0xff, 0xff,
0xff, 0xf8, 0xff, 0xe3, 0xff, 0xff, 0xe6, 0xff,
0xbb, 0xed, 0xff, 0xfc, 0xec, 0xff, 0xf7, 0xfb,
0xfe, 0xf5, 0xe5, 0xd5, 0xff, 0xff, 0xef, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff,
0xff, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff,
0xff, 0xd2, 0xff, 0xff, 0xff, 0xe4, 0xfe, 0xff,
0xff, 0xff, 0xff, 0xce, 0xff, 0xeb, 0xef, 0xfd,
0xfc, 0xe5, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf0,
};
Vtx pistol_Arm_mesh_layer_1_vtx_0[174] = {
{{ {43, 30, -1}, 0, {-304, 922}, {0, 0, 129, 255} }},
{{ {34, 42, -1}, 0, {181, 1299}, {0, 0, 129, 255} }},
{{ {47, 39, -1}, 0, {63, 771}, {0, 0, 129, 255} }},
{{ {43, 30, 4}, 0, {272, 922}, {0, 0, 127, 255} }},
{{ {47, 39, 4}, 0, {-95, 771}, {0, 0, 127, 255} }},
{{ {34, 42, 4}, 0, {-213, 1299}, {0, 0, 127, 255} }},
{{ {74, 19, 0}, 0, {-306, 916}, {195, 187, 168, 255} }},
{{ {77, 14, 1}, 0, {-492, 797}, {195, 187, 168, 255} }},
{{ {72, 19, 1}, 0, {-306, 1008}, {195, 187, 168, 255} }},
{{ {77, 14, 1}, 0, {-16, 1484}, {107, 68, 0, 255} }},
{{ {74, 19, 0}, 0, {46, 1298}, {107, 68, 0, 255} }},
{{ {74, 19, 3}, 0, {-78, 1298}, {107, 68, 0, 255} }},
{{ {77, 14, 1}, 0, {460, 797}, {195, 187, 88, 255} }},
{{ {74, 19, 3}, 0, {274, 916}, {195, 187, 88, 255} }},
{{ {72, 19, 1}, 0, {274, 1008}, {195, 187, 88, 255} }},
{{ {70, 13, 4}, 0, {-119, 331}, {237, 209, 117, 255} }},
{{ {70, 13, -1}, 0, {87, 331}, {237, 209, 139, 255} }},
{{ {82, 13, -1}, 0, {87, -181}, {23, 208, 141, 255} }},
{{ {82, 13, 4}, 0, {-119, -181}, {23, 208, 115, 255} }},
{{ {65, 18, 4}, 0, {87, 1267}, {218, 219, 115, 255} }},
{{ {70, 13, -1}, 0, {-119, 1472}, {237, 209, 139, 255} }},
{{ {70, 13, 4}, 0, {87, 1472}, {237, 209, 117, 255} }},
{{ {65, 18, -1}, 0, {-119, 1267}, {218, 219, 141, 255} }},
{{ {70, 14, 2}, 0, {-16, 314}, {49, 117, 0, 255} }},
{{ {70, 13, 4}, 0, {87, 331}, {237, 209, 117, 255} }},
{{ {82, 13, 4}, 0, {87, -181}, {23, 208, 115, 255} }},
{{ {82, 14, 2}, 0, {-16, -162}, {201, 115, 0, 255} }},
{{ {70, 13, -1}, 0, {-119, 331}, {237, 209, 139, 255} }},
{{ {82, 13, -1}, 0, {-119, -181}, {23, 208, 141, 255} }},
{{ {66, 18, 2}, 0, {-16, 1251}, {91, 89, 0, 255} }},
{{ {65, 18, 4}, 0, {-119, 1267}, {218, 219, 115, 255} }},
{{ {70, 13, 4}, 0, {-119, 1472}, {237, 209, 117, 255} }},
{{ {70, 14, 2}, 0, {-16, 1432}, {49, 117, 0, 255} }},
{{ {65, 18, -1}, 0, {87, 1267}, {218, 219, 141, 255} }},
{{ {70, 13, -1}, 0, {87, 1472}, {237, 209, 139, 255} }},
{{ {82, 14, 2}, 0, {-16, 1432}, {201, 115, 0, 255} }},
{{ {82, 13, 4}, 0, {87, 1472}, {23, 208, 115, 255} }},
{{ {86, 18, 4}, 0, {87, 1267}, {44, 241, 118, 255} }},
{{ {86, 18, 2}, 0, {-16, 1253}, {136, 42, 0, 255} }},
{{ {86, 27, 4}, 0, {87, 884}, {22, 0, 125, 255} }},
{{ {86, 27, 2}, 0, {-16, 884}, {129, 0, 0, 255} }},
{{ {86, 18, -1}, 0, {-119, 1267}, {44, 241, 138, 255} }},
{{ {86, 27, -1}, 0, {-119, 884}, {22, 0, 131, 255} }},
{{ {82, 13, -1}, 0, {-119, 1472}, {23, 208, 141, 255} }},
{{ {82, 13, 4}, 0, {-119, 1472}, {23, 208, 115, 255} }},
{{ {82, 13, -1}, 0, {87, 1472}, {23, 208, 141, 255} }},
{{ {86, 18, -1}, 0, {87, 1267}, {44, 241, 138, 255} }},
{{ {86, 18, 4}, 0, {-119, 1267}, {44, 241, 118, 255} }},
{{ {86, 27, -1}, 0, {87, 884}, {22, 0, 131, 255} }},
{{ {86, 27, 4}, 0, {-119, 884}, {22, 0, 125, 255} }},
{{ {127, 28, -2}, 0, {127, 827}, {84, 236, 163, 255} }},
{{ {127, 33, -4}, 0, {209, 647}, {71, 56, 167, 255} }},
{{ {127, 33, 7}, 0, {-241, 647}, {71, 56, 89, 255} }},
{{ {127, 28, 5}, 0, {-159, 827}, {84, 236, 93, 255} }},
{{ {127, 24, -2}, 0, {127, 1008}, {73, 183, 183, 255} }},
{{ {127, 24, 5}, 0, {-159, 1008}, {73, 183, 73, 255} }},
{{ {108, 33, 7}, 0, {209, -1241}, {10, 77, 101, 255} }},
{{ {127, 33, 7}, 0, {209, -2006}, {71, 56, 89, 255} }},
{{ {127, 33, -4}, 0, {-241, -2006}, {71, 56, 167, 255} }},
{{ {38, 33, -4}, 0, {-241, 1660}, {183, 73, 183, 255} }},
{{ {38, 33, -4}, 0, {-241, 1660}, {183, 73, 183, 255} }},
{{ {38, 33, 7}, 0, {209, 1660}, {183, 73, 73, 255} }},
{{ {108, 33, 7}, 0, {209, -1241}, {10, 77, 101, 255} }},
{{ {102, 24, -4}, 0, {-16, -982}, {12, 167, 166, 255} }},
{{ {38, 24, -4}, 0, {-16, 1660}, {183, 183, 183, 255} }},
{{ {38, 33, -4}, 0, {345, 1660}, {183, 73, 183, 255} }},
{{ {108, 33, -4}, 0, {345, -1241}, {9, 232, 132, 255} }},
{{ {127, 33, -4}, 0, {345, -2006}, {71, 56, 167, 255} }},
{{ {108, 28, -2}, 0, {165, -1241}, {26, 229, 135, 255} }},
{{ {127, 28, -2}, 0, {165, -2006}, {84, 236, 163, 255} }},
{{ {108, 24, -2}, 0, {-16, -1241}, {19, 164, 170, 255} }},
{{ {127, 24, -2}, 0, {-16, -2006}, {73, 183, 183, 255} }},
{{ {38, 24, 7}, 0, {209, 1008}, {183, 183, 73, 255} }},
{{ {38, 33, 7}, 0, {209, 647}, {183, 73, 73, 255} }},
{{ {38, 33, -4}, 0, {-241, 647}, {183, 73, 183, 255} }},
{{ {38, 24, -4}, 0, {-241, 1008}, {183, 183, 183, 255} }},
{{ {108, 24, -2}, 0, {127, -1241}, {19, 164, 170, 255} }},
{{ {127, 24, -2}, 0, {127, -2006}, {73, 183, 183, 255} }},
{{ {127, 24, 5}, 0, {-159, -2006}, {73, 183, 73, 255} }},
{{ {108, 24, 5}, 0, {-159, -1241}, {19, 164, 86, 255} }},
{{ {38, 24, 7}, 0, {-241, 1660}, {183, 183, 73, 255} }},
{{ {102, 24, 7}, 0, {-241, -982}, {12, 167, 90, 255} }},
{{ {102, 24, -4}, 0, {209, -982}, {12, 167, 166, 255} }},
{{ {38, 24, -4}, 0, {209, 1660}, {183, 183, 183, 255} }},
{{ {102, 24, 7}, 0, {-16, -982}, {12, 167, 90, 255} }},
{{ {38, 33, 7}, 0, {-377, 1660}, {183, 73, 73, 255} }},
{{ {38, 24, 7}, 0, {-16, 1660}, {183, 183, 73, 255} }},
{{ {108, 33, 7}, 0, {-377, -1241}, {10, 77, 101, 255} }},
{{ {108, 24, 5}, 0, {-16, -1241}, {19, 164, 86, 255} }},
{{ {108, 28, 5}, 0, {-197, -1241}, {26, 229, 121, 255} }},
{{ {127, 24, 5}, 0, {-16, -2006}, {73, 183, 73, 255} }},
{{ {127, 28, 5}, 0, {-197, -2006}, {84, 236, 93, 255} }},
{{ {127, 28, 5}, 0, {-197, -2006}, {84, 236, 93, 255} }},
{{ {127, 33, 7}, 0, {-377, -2006}, {71, 56, 89, 255} }},
{{ {108, 33, 7}, 0, {-377, -1241}, {10, 77, 101, 255} }},
{{ {86, 36, -3}, 0, {480, -347}, {179, 205, 169, 255} }},
{{ {86, 40, -3}, 0, {664, -347}, {179, 51, 169, 255} }},
{{ {130, 40, -3}, 0, {664, -2149}, {0, 64, 146, 255} }},
{{ {130, 36, -3}, 0, {480, -2149}, {0, 192, 146, 255} }},
{{ {86, 40, -3}, 0, {-176, -347}, {179, 51, 169, 255} }},
{{ {130, 43, 2}, 0, {-16, -2149}, {0, 127, 0, 255} }},
{{ {130, 40, -3}, 0, {-176, -2149}, {0, 64, 146, 255} }},
{{ {86, 43, 2}, 0, {-16, -347}, {178, 101, 0, 255} }},
{{ {130, 40, 6}, 0, {144, -2149}, {0, 64, 110, 255} }},
{{ {86, 40, 6}, 0, {144, -347}, {179, 51, 87, 255} }},
{{ {86, 34, 2}, 0, {-16, -347}, {178, 155, 0, 255} }},
{{ {86, 36, -3}, 0, {144, -347}, {179, 205, 169, 255} }},
{{ {130, 36, -3}, 0, {144, -2149}, {0, 192, 146, 255} }},
{{ {86, 34, 2}, 0, {-16, -347}, {178, 155, 0, 255} }},
{{ {130, 36, -3}, 0, {144, -2149}, {0, 192, 146, 255} }},
{{ {130, 34, 2}, 0, {-16, -2149}, {0, 129, 0, 255} }},
{{ {86, 36, 6}, 0, {-176, -347}, {179, 205, 87, 255} }},
{{ {130, 36, 6}, 0, {-176, -2149}, {0, 192, 110, 255} }},
{{ {86, 43, 2}, 0, {-16, 235}, {178, 101, 0, 255} }},
{{ {86, 40, -3}, 0, {-176, 328}, {179, 51, 169, 255} }},
{{ {86, 36, -3}, 0, {-176, 512}, {179, 205, 169, 255} }},
{{ {86, 36, 6}, 0, {144, 512}, {179, 205, 87, 255} }},
{{ {86, 34, 2}, 0, {-16, 604}, {178, 155, 0, 255} }},
{{ {86, 40, 6}, 0, {144, 328}, {179, 51, 87, 255} }},
{{ {86, 40, 6}, 0, {-696, -347}, {179, 51, 87, 255} }},
{{ {86, 36, 6}, 0, {-512, -347}, {179, 205, 87, 255} }},
{{ {130, 36, 6}, 0, {-512, -2149}, {0, 192, 110, 255} }},
{{ {130, 40, 6}, 0, {-696, -2149}, {0, 64, 110, 255} }},
{{ {38, 33, 7}, 0, {209, 2872}, {0, 127, 0, 255} }},
{{ {127, 33, 7}, 0, {209, -794}, {0, 127, 0, 255} }},
{{ {127, 33, -4}, 0, {-241, -794}, {0, 127, 0, 255} }},
{{ {38, 33, -4}, 0, {-241, 2872}, {0, 127, 0, 255} }},
{{ {38, 33, 7}, 0, {190, 2872}, {161, 26, 81, 255} }},
{{ {127, 33, 7}, 0, {190, -794}, {90, 0, 90, 255} }},
{{ {127, 42, 7}, 0, {-172, -794}, {77, 51, 87, 255} }},
{{ {40, 42, 7}, 0, {-172, 2770}, {187, 66, 83, 255} }},
{{ {127, 42, 7}, 0, {-241, 852}, {77, 51, 87, 255} }},
{{ {127, 33, 7}, 0, {-241, 1214}, {90, 0, 90, 255} }},
{{ {127, 33, -4}, 0, {209, 1214}, {90, 0, 166, 255} }},
{{ {127, 42, -4}, 0, {209, 852}, {77, 51, 169, 255} }},
{{ {127, 45, 2}, 0, {-16, 721}, {78, 101, 0, 255} }},
{{ {127, 33, -4}, 0, {-222, -794}, {90, 0, 166, 255} }},
{{ {38, 33, -4}, 0, {-222, 2872}, {161, 26, 175, 255} }},
{{ {40, 42, -4}, 0, {140, 2770}, {187, 66, 173, 255} }},
{{ {127, 33, -4}, 0, {-222, -794}, {90, 0, 166, 255} }},
{{ {40, 42, -4}, 0, {140, 2770}, {187, 66, 173, 255} }},
{{ {127, 42, -4}, 0, {140, -794}, {77, 51, 169, 255} }},
{{ {40, 42, -4}, 0, {-241, 852}, {187, 66, 173, 255} }},
{{ {38, 33, -4}, 0, {-241, 1214}, {161, 26, 175, 255} }},
{{ {38, 33, 7}, 0, {209, 1214}, {161, 26, 81, 255} }},
{{ {40, 42, 7}, 0, {209, 852}, {187, 66, 83, 255} }},
{{ {127, 45, 2}, 0, {-16, -794}, {78, 101, 0, 255} }},
{{ {127, 42, -4}, 0, {-241, -794}, {77, 51, 169, 255} }},
{{ {40, 42, -4}, 0, {-241, 2770}, {187, 66, 173, 255} }},
{{ {44, 45, 2}, 0, {-16, 2626}, {227, 124, 0, 255} }},
{{ {40, 42, 7}, 0, {209, 2770}, {187, 66, 83, 255} }},
{{ {127, 42, 7}, 0, {209, -794}, {77, 51, 87, 255} }},
{{ {47, 39, -1}, 0, {-104, 771}, {27, 124, 0, 255} }},
{{ {34, 42, -1}, 0, {-104, 1299}, {27, 124, 0, 255} }},
{{ {34, 42, 4}, 0, {72, 1299}, {27, 124, 0, 255} }},
{{ {47, 39, -1}, 0, {-104, 771}, {27, 124, 0, 255} }},
{{ {34, 42, 4}, 0, {72, 1299}, {27, 124, 0, 255} }},
{{ {47, 39, 4}, 0, {72, 771}, {27, 124, 0, 255} }},
{{ {34, 42, -1}, 0, {-104, 811}, {155, 178, 0, 255} }},
{{ {43, 30, -1}, 0, {-104, 1296}, {155, 178, 0, 255} }},
{{ {43, 30, 4}, 0, {72, 1296}, {155, 178, 0, 255} }},
{{ {34, 42, 4}, 0, {72, 811}, {155, 178, 0, 255} }},
{{ {74, 26, 3}, 0, {-16, 916}, {183, 0, 104, 255} }},
{{ {72, 26, 1}, 0, {-16, 1008}, {183, 0, 104, 255} }},
{{ {72, 19, 1}, 0, {274, 1008}, {183, 0, 104, 255} }},
{{ {74, 19, 3}, 0, {274, 916}, {183, 0, 104, 255} }},
{{ {72, 26, 1}, 0, {-16, 1008}, {183, 0, 152, 255} }},
{{ {74, 26, 0}, 0, {-16, 916}, {183, 0, 152, 255} }},
{{ {74, 19, 0}, 0, {-306, 916}, {183, 0, 152, 255} }},
{{ {72, 19, 1}, 0, {-306, 1008}, {183, 0, 152, 255} }},
{{ {74, 19, 0}, 0, {46, 1298}, {127, 0, 0, 255} }},
{{ {74, 26, 0}, 0, {46, 1008}, {127, 0, 0, 255} }},
{{ {74, 26, 3}, 0, {-78, 1008}, {127, 0, 0, 255} }},
{{ {74, 19, 3}, 0, {-78, 1298}, {127, 0, 0, 255} }},
};
Gfx pistol_Arm_mesh_layer_1_tri_0[] = {
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 0, 15, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 15, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 7, 5, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(12, 8, 11, 0),
gsSP1Triangle(12, 11, 13, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 29, 15, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 0, 3, 0),
gsSP1Triangle(4, 3, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 8, 9, 0),
gsSP1Triangle(9, 8, 10, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(12, 9, 11, 0),
gsSP1Triangle(12, 11, 13, 0),
gsSP1Triangle(14, 9, 12, 0),
gsSP1Triangle(14, 6, 9, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 44, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(3, 2, 4, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 8, 9, 0),
gsSP1Triangle(9, 10, 6, 0),
gsSP1Triangle(9, 11, 10, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 60, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(5, 6, 3, 0),
gsSP1Triangle(5, 7, 6, 0),
gsSP1Triangle(8, 6, 7, 0),
gsSP1Triangle(8, 7, 9, 0),
gsSP1Triangle(10, 8, 9, 0),
gsSP1Triangle(10, 9, 11, 0),
gsSP1Triangle(6, 8, 10, 0),
gsSP1Triangle(6, 10, 3, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 76, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(3, 4, 0, 0),
gsSP1Triangle(3, 5, 4, 0),
gsSP1Triangle(4, 6, 0, 0),
gsSP1Triangle(4, 7, 6, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 11, 9, 0),
gsSP1Triangle(12, 11, 8, 0),
gsSP1Triangle(12, 13, 11, 0),
gsSP1Triangle(14, 13, 12, 0),
gsSP1Triangle(14, 15, 13, 0),
gsSP1Triangle(15, 11, 13, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 92, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(3, 5, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(7, 10, 8, 0),
gsSP1Triangle(10, 11, 8, 0),
gsSP1Triangle(10, 12, 11, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 108, 15, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 0, 2, 0),
gsSP1Triangle(3, 2, 4, 0),
gsSP1Triangle(5, 6, 7, 0),
gsSP1Triangle(5, 7, 8, 0),
gsSP1Triangle(7, 9, 8, 0),
gsSP1Triangle(8, 10, 5, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSP1Triangle(11, 13, 14, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 123, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 6, 7, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(11, 12, 8, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 139, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(3, 5, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(7, 9, 10, 0),
gsSP1Triangle(10, 9, 11, 0),
gsSP1Triangle(12, 10, 11, 0),
gsSP1Triangle(12, 7, 10, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 155, 15, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(3, 5, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(7, 9, 10, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSP1Triangle(11, 13, 14, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_0 + 170, 4, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSPEndDisplayList(),
};
Vtx pistol_Arm_mesh_layer_1_vtx_1[34] = {
{{ {56, -22, -3}, 0, {168, 2906}, {127, 0, 0, 255} }},
{{ {56, -14, -3}, 0, {168, 2582}, {127, 0, 0, 255} }},
{{ {56, -14, 6}, 0, {-200, 2582}, {127, 0, 0, 255} }},
{{ {56, -22, 6}, 0, {-200, 2906}, {127, 0, 0, 255} }},
{{ {56, -14, -3}, 0, {-1590, 906}, {0, 0, 129, 255} }},
{{ {56, -22, -3}, 0, {-1914, 906}, {0, 0, 129, 255} }},
{{ {30, -14, -3}, 0, {-1590, 1971}, {0, 0, 129, 255} }},
{{ {41, 20, -3}, 0, {-173, 1528}, {0, 0, 129, 255} }},
{{ {68, 24, -3}, 0, {-16, 414}, {0, 0, 129, 255} }},
{{ {39, 24, -3}, 0, {-16, 1602}, {0, 0, 129, 255} }},
{{ {68, 24, 6}, 0, {-200, 1008}, {121, 218, 0, 255} }},
{{ {56, -14, 6}, 0, {-200, 2582}, {121, 218, 0, 255} }},
{{ {56, -14, -3}, 0, {168, 2582}, {121, 218, 0, 255} }},
{{ {68, 24, -3}, 0, {168, 1008}, {121, 218, 0, 255} }},
{{ {30, -14, 6}, 0, {-200, 1971}, {219, 134, 0, 255} }},
{{ {30, -14, -3}, 0, {168, 1971}, {219, 134, 0, 255} }},
{{ {56, -22, -3}, 0, {168, 906}, {219, 134, 0, 255} }},
{{ {56, -22, 6}, 0, {-200, 906}, {219, 134, 0, 255} }},
{{ {30, -14, 6}, 0, {168, 2582}, {135, 38, 0, 255} }},
{{ {41, 20, -3}, 0, {-200, 1165}, {135, 38, 0, 255} }},
{{ {30, -14, -3}, 0, {-200, 2582}, {135, 38, 0, 255} }},
{{ {41, 20, 6}, 0, {168, 1165}, {135, 38, 0, 255} }},
{{ {39, 24, -3}, 0, {-200, 1008}, {141, 202, 0, 255} }},
{{ {41, 20, -3}, 0, {-200, 1165}, {141, 202, 0, 255} }},
{{ {41, 20, 6}, 0, {168, 1165}, {141, 202, 0, 255} }},
{{ {39, 24, 6}, 0, {168, 1008}, {141, 202, 0, 255} }},
{{ {30, -14, 6}, 0, {1558, 1971}, {0, 0, 127, 255} }},
{{ {56, -22, 6}, 0, {1882, 906}, {0, 0, 127, 255} }},
{{ {56, -14, 6}, 0, {1558, 906}, {0, 0, 127, 255} }},
{{ {41, 20, 6}, 0, {141, 1528}, {0, 0, 127, 255} }},
{{ {56, -14, 6}, 0, {1558, 906}, {0, 0, 127, 255} }},
{{ {68, 24, 6}, 0, {-16, 414}, {0, 0, 127, 255} }},
{{ {41, 20, 6}, 0, {141, 1528}, {0, 0, 127, 255} }},
{{ {39, 24, 6}, 0, {-16, 1602}, {0, 0, 127, 255} }},
};
Gfx pistol_Arm_mesh_layer_1_tri_1[] = {
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_1 + 0, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 6, 7, 0),
gsSP1Triangle(4, 7, 8, 0),
gsSP1Triangle(7, 9, 8, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 12, 13, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_1 + 14, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 7, 5, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(15, 12, 14, 0),
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_1 + 30, 4, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(1, 3, 2, 0),
gsSPEndDisplayList(),
};
Vtx pistol_Arm_mesh_layer_1_vtx_2[6] = {
{{ {130, 36, -3}, 0, {144, 512}, {127, 0, 0, 255} }},
{{ {130, 40, -3}, 0, {144, 328}, {127, 0, 0, 255} }},
{{ {130, 43, 2}, 0, {-16, 235}, {127, 0, 0, 255} }},
{{ {130, 36, 6}, 0, {-176, 512}, {127, 0, 0, 255} }},
{{ {130, 40, 6}, 0, {-176, 328}, {127, 0, 0, 255} }},
{{ {130, 34, 2}, 0, {-16, 604}, {127, 0, 0, 255} }},
};
Gfx pistol_Arm_mesh_layer_1_tri_2[] = {
gsSPVertex(pistol_Arm_mesh_layer_1_vtx_2 + 0, 6, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(2, 3, 0, 0),
gsSP1Triangle(2, 4, 3, 0),
gsSP1Triangle(3, 5, 0, 0),
gsSPEndDisplayList(),
};
Gfx mat_pistol_gray[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(pistol_gray_lights),
gsSPEndDisplayList(),
};
Gfx mat_pistol_darkergray[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(pistol_darkergray_lights),
gsDPSetTextureImage(G_IM_FMT_I, G_IM_SIZ_8b_LOAD_BLOCK, 1, pistol_noise_i8),
gsDPSetTile(G_IM_FMT_I, G_IM_SIZ_8b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0),
gsDPLoadBlock(7, 0, 0, 511, 512),
gsDPSetTile(G_IM_FMT_I, G_IM_SIZ_8b, 4, 0, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0),
gsDPSetTileSize(0, 0, 0, 124, 124),
gsSPEndDisplayList(),
};
Gfx mat_pistol_black_layer1[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
gsDPSetRenderMode(G_RM_ZB_OPA_SURF, G_RM_ZB_OPA_SURF2),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPEndDisplayList(),
};
Gfx mat_revert_pistol_black_layer1[] = {
gsDPPipeSync(),
gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2),
gsSPEndDisplayList(),
};
Gfx pistol_Arm_mesh_layer_1[] = {
gsSPDisplayList(mat_pistol_gray),
gsSPDisplayList(pistol_Arm_mesh_layer_1_tri_0),
gsSPDisplayList(mat_pistol_darkergray),
gsSPDisplayList(pistol_Arm_mesh_layer_1_tri_1),
gsSPDisplayList(mat_pistol_black_layer1),
gsSPDisplayList(pistol_Arm_mesh_layer_1_tri_2),
gsSPDisplayList(mat_revert_pistol_black_layer1),
gsSPEndDisplayList(),
};
Gfx pistol_material_revert_render_settings[] = {
gsDPPipeSync(),
gsSPSetGeometryMode(G_LIGHTING),
gsSPClearGeometryMode(G_TEXTURE_GEN),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 0),
gsDPSetEnvColor(255, 255, 255, 255),
gsDPSetAlphaCompare(G_AC_NONE),
gsSPEndDisplayList(),
};

Binary file not shown.

View file

@ -0,0 +1,24 @@
#include "src/game/envfx_snow.h"
const GeoLayout shotgun_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_SCALE(LAYER_FORCE, 65536),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_set_player_colors),
GEO_ASM(8, geo_mario_set_player_colors),
GEO_SWITCH_CASE(0, geo_switch_anim_state),
GEO_OPEN_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, -45, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 25, 0, 0, shotgun_Arm_mesh_layer_1),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, shotgun_material_revert_render_settings),
GEO_CLOSE_NODE(),
GEO_END(),
};

View file

@ -0,0 +1,22 @@
extern const GeoLayout shotgun_geo[];
extern Lights1 shotgun_wood_lights;
extern Lights1 shotgun_darkgray_lights;
extern Lights1 shotgun_metal_lights;
extern u8 shotgun_wood_rgba16[];
extern u8 shotgun_plat_rgba16[];
extern Vtx shotgun_Arm_mesh_layer_1_vtx_0[108];
extern Gfx shotgun_Arm_mesh_layer_1_tri_0[];
extern Vtx shotgun_Arm_mesh_layer_1_vtx_1[68];
extern Gfx shotgun_Arm_mesh_layer_1_tri_1[];
extern Vtx shotgun_Arm_mesh_layer_1_vtx_2[46];
extern Gfx shotgun_Arm_mesh_layer_1_tri_2[];
extern Vtx shotgun_Arm_mesh_layer_1_vtx_3[10];
extern Gfx shotgun_Arm_mesh_layer_1_tri_3[];
extern Gfx mat_shotgun_wood[];
extern Gfx mat_shotgun_darkgray[];
extern Gfx mat_shotgun_metal[];
extern Gfx mat_revert_shotgun_metal[];
extern Gfx mat_shotgun_black_layer1[];
extern Gfx mat_revert_shotgun_black_layer1[];
extern Gfx shotgun_Arm_mesh_layer_1[];
extern Gfx shotgun_material_revert_render_settings[];

View file

@ -0,0 +1,528 @@
Lights1 shotgun_wood_lights = gdSPDefLights1(
0x7F, 0x7F, 0x7F,
0xFF, 0xFF, 0xFF, 0x28, 0x28, 0x28);
Lights1 shotgun_darkgray_lights = gdSPDefLights1(
0x3B, 0x3B, 0x3B,
0x7C, 0x7C, 0x7C, 0x28, 0x28, 0x28);
Lights1 shotgun_metal_lights = gdSPDefLights1(
0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x28, 0x28, 0x28);
Gfx shotgun_wood_rgba16_aligner[] = {gsSPEndDisplayList()};
u8 shotgun_wood_rgba16[] = {
#include "actors/shotgun/wood.rgba16.inc.c"
};
Gfx shotgun_plat_rgba16_aligner[] = {gsSPEndDisplayList()};
u8 shotgun_plat_rgba16[] = {
#include "actors/shotgun/plat.rgba16.inc.c"
};
Vtx shotgun_Arm_mesh_layer_1_vtx_0[108] = {
{{ {65, 23, 1}, 0, {-20, 1252}, {213, 137, 0, 255} }},
{{ {79, 21, -2}, 0, {67, 827}, {238, 150, 188, 255} }},
{{ {79, 21, 4}, 0, {-107, 827}, {239, 150, 68, 255} }},
{{ {90, 21, 4}, 0, {-107, 498}, {0, 148, 66, 255} }},
{{ {90, 21, -2}, 0, {67, 498}, {0, 148, 190, 255} }},
{{ {45, 19, 5}, 0, {-116, 1841}, {38, 183, 97, 255} }},
{{ {45, 19, -2}, 0, {75, 1841}, {38, 183, 159, 255} }},
{{ {5, 0, -2}, 0, {75, 3047}, {202, 163, 189, 255} }},
{{ {5, 0, 5}, 0, {-116, 3047}, {202, 163, 68, 255} }},
{{ {5, 0, -2}, 0, {-717, 3047}, {202, 163, 189, 255} }},
{{ {4, 26, -4}, 0, {68, 3097}, {182, 67, 178, 255} }},
{{ {45, 19, -2}, 0, {-166, 1841}, {38, 183, 159, 255} }},
{{ {45, 27, -1}, 0, {82, 1841}, {247, 88, 165, 255} }},
{{ {65, 23, 1}, 0, {-29, 1252}, {213, 137, 0, 255} }},
{{ {60, 33, -1}, 0, {279, 1404}, {208, 73, 164, 255} }},
{{ {79, 21, -2}, 0, {-106, 827}, {238, 150, 188, 255} }},
{{ {79, 21, -2}, 0, {-106, 827}, {238, 150, 188, 255} }},
{{ {60, 33, -1}, 0, {279, 1404}, {208, 73, 164, 255} }},
{{ {79, 26, -4}, 0, {64, 827}, {239, 224, 134, 255} }},
{{ {79, 37, -4}, 0, {383, 827}, {71, 38, 158, 255} }},
{{ {74, 40, -1}, 0, {473, 976}, {229, 112, 202, 255} }},
{{ {79, 30, -4}, 0, {190, 827}, {25, 40, 138, 255} }},
{{ {90, 26, -4}, 0, {64, 498}, {0, 226, 133, 255} }},
{{ {90, 30, -4}, 0, {190, 498}, {0, 90, 166, 255} }},
{{ {90, 21, -2}, 0, {-106, 498}, {0, 148, 190, 255} }},
{{ {79, 37, -4}, 0, {-186, 827}, {71, 38, 158, 255} }},
{{ {74, 40, -1}, 0, {-88, 976}, {229, 112, 202, 255} }},
{{ {79, 40, -1}, 0, {-91, 827}, {82, 91, 220, 255} }},
{{ {74, 40, 4}, 0, {64, 976}, {230, 112, 54, 255} }},
{{ {60, 33, -1}, 0, {-80, 1404}, {208, 73, 164, 255} }},
{{ {45, 27, 3}, 0, {48, 1841}, {248, 88, 91, 255} }},
{{ {45, 27, -1}, 0, {-71, 1841}, {247, 88, 165, 255} }},
{{ {45, 27, -1}, 0, {-71, 1841}, {247, 88, 165, 255} }},
{{ {4, 26, 7}, 0, {162, 3097}, {183, 67, 79, 255} }},
{{ {45, 27, 3}, 0, {48, 1841}, {248, 88, 91, 255} }},
{{ {4, 26, -4}, 0, {-186, 3097}, {182, 67, 178, 255} }},
{{ {60, 33, 4}, 0, {56, 1404}, {209, 73, 93, 255} }},
{{ {74, 40, 4}, 0, {64, 976}, {230, 112, 54, 255} }},
{{ {90, 26, -4}, 0, {-186, 928}, {129, 0, 0, 255} }},
{{ {90, 21, -2}, 0, {-99, 1098}, {129, 0, 0, 255} }},
{{ {90, 21, 4}, 0, {75, 1098}, {129, 0, 0, 255} }},
{{ {90, 30, 7}, 0, {162, 802}, {129, 0, 0, 255} }},
{{ {90, 26, 7}, 0, {162, 928}, {129, 0, 0, 255} }},
{{ {90, 30, -4}, 0, {-186, 802}, {129, 0, 0, 255} }},
{{ {5, 0, -2}, 0, {-107, 1709}, {202, 163, 189, 255} }},
{{ {5, 0, 5}, 0, {84, 1709}, {202, 163, 68, 255} }},
{{ {4, 26, 7}, 0, {162, 924}, {183, 67, 79, 255} }},
{{ {4, 26, -4}, 0, {-186, 924}, {182, 67, 178, 255} }},
{{ {5, 0, 5}, 0, {685, 3047}, {202, 163, 68, 255} }},
{{ {45, 19, 5}, 0, {134, 1841}, {38, 183, 97, 255} }},
{{ {4, 26, 7}, 0, {-100, 3097}, {183, 67, 79, 255} }},
{{ {45, 27, 3}, 0, {-114, 1841}, {248, 88, 91, 255} }},
{{ {65, 23, 1}, 0, {-3, 1252}, {213, 137, 0, 255} }},
{{ {60, 33, 4}, 0, {-311, 1404}, {209, 73, 93, 255} }},
{{ {79, 21, 4}, 0, {74, 827}, {239, 150, 68, 255} }},
{{ {79, 26, 7}, 0, {-96, 827}, {239, 224, 122, 255} }},
{{ {90, 21, 4}, 0, {74, 498}, {0, 148, 66, 255} }},
{{ {90, 26, 7}, 0, {-96, 498}, {0, 226, 123, 255} }},
{{ {90, 30, 7}, 0, {-222, 498}, {0, 90, 90, 255} }},
{{ {79, 30, 7}, 0, {-222, 827}, {26, 40, 118, 255} }},
{{ {79, 37, 7}, 0, {-415, 827}, {72, 38, 97, 255} }},
{{ {74, 40, 4}, 0, {-505, 976}, {230, 112, 54, 255} }},
{{ {79, 40, 4}, 0, {-99, 524}, {82, 91, 35, 255} }},
{{ {79, 37, 7}, 0, {-194, 609}, {72, 38, 97, 255} }},
{{ {79, 30, 7}, 0, {-194, 802}, {26, 40, 118, 255} }},
{{ {79, 37, -4}, 0, {154, 609}, {71, 38, 158, 255} }},
{{ {79, 30, -4}, 0, {154, 802}, {25, 40, 138, 255} }},
{{ {79, 40, -1}, 0, {59, 524}, {82, 91, 220, 255} }},
{{ {79, 40, 4}, 0, {67, 827}, {82, 91, 35, 255} }},
{{ {74, 40, 4}, 0, {64, 976}, {230, 112, 54, 255} }},
{{ {79, 37, 7}, 0, {162, 827}, {72, 38, 97, 255} }},
{{ {79, 40, -1}, 0, {-91, 827}, {82, 91, 220, 255} }},
{{ {79, 30, 7}, 0, {162, 827}, {26, 40, 118, 255} }},
{{ {90, 30, 7}, 0, {162, 498}, {0, 90, 90, 255} }},
{{ {90, 30, -4}, 0, {-186, 498}, {0, 90, 166, 255} }},
{{ {79, 30, -4}, 0, {-186, 827}, {25, 40, 138, 255} }},
{{ {90, 26, -4}, 0, {-186, 928}, {172, 234, 163, 255} }},
{{ {90, 21, -2}, 0, {-99, 1098}, {179, 170, 204, 255} }},
{{ {90, 21, 4}, 0, {75, 1098}, {179, 170, 53, 255} }},
{{ {90, 30, 7}, 0, {162, 802}, {183, 73, 74, 255} }},
{{ {90, 26, 7}, 0, {162, 928}, {173, 234, 93, 255} }},
{{ {90, 30, -4}, 0, {-186, 802}, {182, 73, 183, 255} }},
{{ {126, 30, -5}, 0, {-186, -580}, {73, 73, 182, 255} }},
{{ {90, 30, -4}, 0, {-186, 498}, {182, 73, 183, 255} }},
{{ {90, 30, 7}, 0, {162, 498}, {183, 73, 74, 255} }},
{{ {126, 30, 7}, 0, {162, -580}, {74, 73, 73, 255} }},
{{ {126, 26, -5}, 0, {64, -580}, {83, 231, 163, 255} }},
{{ {90, 30, -4}, 0, {190, 498}, {182, 73, 183, 255} }},
{{ {126, 30, -5}, 0, {190, -580}, {73, 73, 182, 255} }},
{{ {90, 26, -4}, 0, {64, 498}, {172, 234, 163, 255} }},
{{ {90, 21, -2}, 0, {-106, 498}, {179, 170, 204, 255} }},
{{ {126, 21, -1}, 0, {-106, -580}, {78, 169, 206, 255} }},
{{ {126, 26, 7}, 0, {-96, -580}, {83, 231, 92, 255} }},
{{ {90, 21, 4}, 0, {74, 498}, {179, 170, 53, 255} }},
{{ {126, 21, 4}, 0, {74, -580}, {78, 169, 50, 255} }},
{{ {90, 26, 7}, 0, {-96, 498}, {173, 234, 93, 255} }},
{{ {126, 30, 7}, 0, {-222, -580}, {74, 73, 73, 255} }},
{{ {90, 30, 7}, 0, {-222, 498}, {183, 73, 74, 255} }},
{{ {126, 21, 4}, 0, {-96, -580}, {78, 169, 50, 255} }},
{{ {90, 21, 4}, 0, {-107, 498}, {179, 170, 53, 255} }},
{{ {90, 21, -2}, 0, {67, 498}, {179, 170, 204, 255} }},
{{ {126, 21, -1}, 0, {55, -580}, {78, 169, 206, 255} }},
{{ {126, 26, -5}, 0, {154, 928}, {83, 231, 163, 255} }},
{{ {126, 21, 4}, 0, {-96, 1098}, {78, 169, 50, 255} }},
{{ {126, 21, -1}, 0, {55, 1098}, {78, 169, 206, 255} }},
{{ {126, 26, 7}, 0, {-194, 928}, {83, 231, 92, 255} }},
{{ {126, 30, -5}, 0, {154, 802}, {73, 73, 182, 255} }},
{{ {126, 30, 7}, 0, {-194, 802}, {74, 73, 73, 255} }},
};
Gfx shotgun_Arm_mesh_layer_1_tri_0[] = {
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_0 + 0, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 2, 1, 0),
gsSP1Triangle(3, 1, 4, 0),
gsSP1Triangle(0, 5, 6, 0),
gsSP1Triangle(5, 7, 6, 0),
gsSP1Triangle(5, 8, 7, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(12, 11, 10, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSP1Triangle(14, 13, 12, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_0 + 16, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(2, 1, 3, 0),
gsSP1Triangle(4, 3, 1, 0),
gsSP1Triangle(2, 3, 5, 0),
gsSP1Triangle(6, 2, 5, 0),
gsSP1Triangle(6, 5, 7, 0),
gsSP1Triangle(8, 2, 6, 0),
gsSP1Triangle(8, 0, 2, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(11, 10, 12, 0),
gsSP1Triangle(12, 10, 13, 0),
gsSP1Triangle(14, 12, 13, 0),
gsSP1Triangle(13, 15, 14, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_0 + 32, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 3, 1, 0),
gsSP1Triangle(2, 4, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(8, 9, 6, 0),
gsSP1Triangle(8, 10, 9, 0),
gsSP1Triangle(9, 11, 6, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_0 + 48, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 2, 1, 0),
gsSP1Triangle(1, 4, 3, 0),
gsSP1Triangle(5, 3, 4, 0),
gsSP1Triangle(4, 6, 5, 0),
gsSP1Triangle(6, 7, 5, 0),
gsSP1Triangle(8, 7, 6, 0),
gsSP1Triangle(8, 9, 7, 0),
gsSP1Triangle(7, 9, 10, 0),
gsSP1Triangle(7, 10, 11, 0),
gsSP1Triangle(7, 11, 5, 0),
gsSP1Triangle(11, 12, 5, 0),
gsSP1Triangle(5, 12, 13, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_0 + 62, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(2, 4, 3, 0),
gsSP1Triangle(3, 5, 0, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(9, 7, 6, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 12, 13, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_0 + 76, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(2, 3, 0, 0),
gsSP1Triangle(2, 4, 3, 0),
gsSP1Triangle(3, 5, 0, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 8, 9, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 13, 11, 0),
gsSP1Triangle(10, 14, 13, 0),
gsSP1Triangle(14, 10, 15, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_0 + 92, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(1, 0, 3, 0),
gsSP1Triangle(3, 0, 4, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 8, 9, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 13, 11, 0),
gsSP1Triangle(13, 10, 14, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPEndDisplayList(),
};
Vtx shotgun_Arm_mesh_layer_1_vtx_1[68] = {
{{ {75, 18, 1}, 0, {-173, 958}, {211, 206, 148, 255} }},
{{ {77, 15, 1}, 0, {-274, 894}, {211, 206, 148, 255} }},
{{ {73, 18, 1}, 0, {-173, 1008}, {211, 206, 148, 255} }},
{{ {77, 15, 1}, 0, {-16, 1266}, {107, 68, 0, 255} }},
{{ {75, 18, 1}, 0, {4, 1165}, {107, 68, 0, 255} }},
{{ {75, 18, 2}, 0, {-36, 1165}, {107, 68, 0, 255} }},
{{ {77, 15, 1}, 0, {242, 894}, {212, 206, 108, 255} }},
{{ {75, 18, 2}, 0, {141, 958}, {212, 206, 108, 255} }},
{{ {73, 18, 1}, 0, {141, 1008}, {212, 206, 108, 255} }},
{{ {71, 14, 2}, 0, {-54, 1056}, {233, 200, 111, 255} }},
{{ {71, 14, 0}, 0, {14, 1056}, {232, 200, 145, 255} }},
{{ {81, 14, 0}, 0, {14, 778}, {27, 198, 146, 255} }},
{{ {81, 14, 2}, 0, {-54, 778}, {28, 198, 110, 255} }},
{{ {68, 18, 3}, 0, {22, 1185}, {200, 233, 112, 255} }},
{{ {71, 14, 0}, 0, {-46, 1296}, {232, 200, 145, 255} }},
{{ {71, 14, 2}, 0, {22, 1296}, {233, 200, 111, 255} }},
{{ {68, 18, 3}, 0, {22, 1185}, {200, 233, 112, 255} }},
{{ {68, 18, 0}, 0, {-46, 1185}, {200, 233, 145, 255} }},
{{ {71, 14, 0}, 0, {-46, 1296}, {232, 200, 145, 255} }},
{{ {68, 25, 3}, 0, {22, 978}, {221, 0, 122, 255} }},
{{ {68, 25, 0}, 0, {-46, 978}, {220, 0, 134, 255} }},
{{ {71, 14, 0}, 0, {-46, 1056}, {232, 200, 145, 255} }},
{{ {80, 15, 1}, 0, {-12, 789}, {201, 115, 0, 255} }},
{{ {81, 14, 0}, 0, {-46, 778}, {27, 198, 146, 255} }},
{{ {72, 15, 1}, 0, {-12, 1047}, {49, 117, 0, 255} }},
{{ {81, 14, 2}, 0, {22, 778}, {28, 198, 110, 255} }},
{{ {71, 14, 2}, 0, {22, 1056}, {233, 200, 111, 255} }},
{{ {68, 18, 0}, 0, {14, 1185}, {200, 233, 145, 255} }},
{{ {72, 15, 1}, 0, {-20, 1274}, {49, 117, 0, 255} }},
{{ {71, 14, 0}, 0, {14, 1296}, {232, 200, 145, 255} }},
{{ {68, 18, 1}, 0, {-20, 1176}, {118, 48, 0, 255} }},
{{ {68, 25, 0}, 0, {14, 978}, {220, 0, 134, 255} }},
{{ {68, 25, 0}, 0, {14, 978}, {220, 0, 134, 255} }},
{{ {68, 25, 1}, 0, {-20, 978}, {127, 0, 0, 255} }},
{{ {68, 18, 1}, 0, {-20, 1176}, {118, 48, 0, 255} }},
{{ {68, 18, 3}, 0, {-54, 1185}, {200, 233, 112, 255} }},
{{ {68, 25, 3}, 0, {-54, 978}, {221, 0, 122, 255} }},
{{ {71, 14, 2}, 0, {-54, 1296}, {233, 200, 111, 255} }},
{{ {72, 15, 1}, 0, {-20, 1274}, {49, 117, 0, 255} }},
{{ {81, 14, 2}, 0, {-54, 1296}, {28, 198, 110, 255} }},
{{ {81, 14, 0}, 0, {14, 1296}, {27, 198, 146, 255} }},
{{ {84, 18, 0}, 0, {14, 1185}, {54, 237, 143, 255} }},
{{ {84, 18, 2}, 0, {-54, 1185}, {55, 237, 113, 255} }},
{{ {84, 25, 0}, 0, {14, 978}, {35, 0, 134, 255} }},
{{ {84, 25, 2}, 0, {-54, 978}, {36, 0, 122, 255} }},
{{ {80, 15, 1}, 0, {-12, 1274}, {201, 115, 0, 255} }},
{{ {81, 14, 2}, 0, {22, 1296}, {28, 198, 110, 255} }},
{{ {84, 18, 2}, 0, {22, 1185}, {55, 237, 113, 255} }},
{{ {80, 15, 1}, 0, {-12, 1274}, {201, 115, 0, 255} }},
{{ {84, 18, 2}, 0, {22, 1185}, {55, 237, 113, 255} }},
{{ {83, 18, 1}, 0, {-12, 1177}, {136, 42, 0, 255} }},
{{ {84, 25, 2}, 0, {22, 978}, {36, 0, 122, 255} }},
{{ {83, 25, 1}, 0, {-12, 978}, {129, 0, 0, 255} }},
{{ {84, 18, 0}, 0, {-46, 1185}, {54, 237, 143, 255} }},
{{ {84, 25, 0}, 0, {-46, 978}, {35, 0, 134, 255} }},
{{ {81, 14, 0}, 0, {-46, 1296}, {27, 198, 146, 255} }},
{{ {75, 24, 2}, 0, {-16, 958}, {208, 0, 118, 255} }},
{{ {73, 24, 1}, 0, {-16, 1008}, {208, 0, 118, 255} }},
{{ {73, 18, 1}, 0, {141, 1008}, {208, 0, 118, 255} }},
{{ {75, 18, 2}, 0, {141, 958}, {208, 0, 118, 255} }},
{{ {73, 24, 1}, 0, {-16, 1008}, {208, 0, 139, 255} }},
{{ {75, 24, 1}, 0, {-16, 958}, {208, 0, 139, 255} }},
{{ {75, 18, 1}, 0, {-173, 958}, {208, 0, 139, 255} }},
{{ {73, 18, 1}, 0, {-173, 1008}, {208, 0, 139, 255} }},
{{ {75, 18, 1}, 0, {4, 1165}, {127, 0, 0, 255} }},
{{ {75, 24, 1}, 0, {4, 1008}, {127, 0, 0, 255} }},
{{ {75, 24, 2}, 0, {-36, 1008}, {127, 0, 0, 255} }},
{{ {75, 18, 2}, 0, {-36, 1165}, {127, 0, 0, 255} }},
};
Gfx shotgun_Arm_mesh_layer_1_tri_1[] = {
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_1 + 0, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 4, 5, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(9, 10, 11, 0),
gsSP1Triangle(9, 11, 12, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_1 + 16, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(3, 1, 0, 0),
gsSP1Triangle(3, 4, 1, 0),
gsSP1Triangle(5, 6, 7, 0),
gsSP1Triangle(5, 8, 6, 0),
gsSP1Triangle(8, 9, 6, 0),
gsSP1Triangle(8, 10, 9, 0),
gsSP1Triangle(11, 12, 13, 0),
gsSP1Triangle(11, 14, 12, 0),
gsSP1Triangle(15, 14, 11, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_1 + 32, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(1, 3, 2, 0),
gsSP1Triangle(1, 4, 3, 0),
gsSP1Triangle(2, 3, 5, 0),
gsSP1Triangle(2, 5, 6, 0),
gsSP1Triangle(7, 8, 9, 0),
gsSP1Triangle(7, 9, 10, 0),
gsSP1Triangle(10, 9, 11, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(13, 14, 15, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_1 + 48, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(2, 1, 3, 0),
gsSP1Triangle(2, 3, 4, 0),
gsSP1Triangle(5, 2, 4, 0),
gsSP1Triangle(5, 4, 6, 0),
gsSP1Triangle(7, 2, 5, 0),
gsSP1Triangle(7, 0, 2, 0),
gsSP1Triangle(8, 9, 10, 0),
gsSP1Triangle(8, 10, 11, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_1 + 64, 4, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSPEndDisplayList(),
};
Vtx shotgun_Arm_mesh_layer_1_vtx_2[46] = {
{{ {196, 22, 3}, 0, {-160, -3197}, {0, 146, 63, 255} }},
{{ {79, 26, 6}, 0, {-419, 315}, {179, 0, 101, 255} }},
{{ {79, 22, 4}, 0, {-160, 315}, {179, 169, 51, 255} }},
{{ {196, 26, 6}, 0, {-419, -3197}, {0, 0, 127, 255} }},
{{ {79, 30, 4}, 0, {-678, 315}, {155, 38, 66, 255} }},
{{ {196, 30, 3}, 0, {-678, -3197}, {0, 64, 110, 255} }},
{{ {196, 22, -2}, 0, {-119, -3197}, {0, 146, 193, 255} }},
{{ {196, 22, 3}, 0, {-418, -3197}, {0, 146, 63, 255} }},
{{ {79, 22, 4}, 0, {-418, 315}, {179, 169, 51, 255} }},
{{ {79, 22, -1}, 0, {-119, 315}, {178, 169, 206, 255} }},
{{ {79, 22, 4}, 0, {-102, 546}, {179, 169, 51, 255} }},
{{ {79, 26, 6}, 0, {48, 416}, {179, 0, 101, 255} }},
{{ {79, 30, 4}, 0, {-102, 286}, {155, 38, 66, 255} }},
{{ {79, 26, -4}, 0, {-551, 416}, {178, 0, 156, 255} }},
{{ {79, 30, -1}, 0, {-401, 286}, {154, 38, 190, 255} }},
{{ {79, 22, -1}, 0, {-401, 546}, {178, 169, 206, 255} }},
{{ {196, 30, -2}, 0, {158, -3197}, {0, 63, 146, 255} }},
{{ {79, 26, -4}, 0, {-101, 315}, {178, 0, 156, 255} }},
{{ {79, 30, -1}, 0, {158, 315}, {154, 38, 190, 255} }},
{{ {196, 26, -4}, 0, {-101, -3197}, {0, 0, 129, 255} }},
{{ {79, 22, -1}, 0, {-360, 315}, {178, 169, 206, 255} }},
{{ {196, 22, -2}, 0, {-360, -3197}, {0, 146, 193, 255} }},
{{ {79, 30, -1}, 0, {-401, 286}, {154, 218, 190, 255} }},
{{ {79, 30, 4}, 0, {-102, 286}, {155, 218, 66, 255} }},
{{ {79, 35, 6}, 0, {48, 157}, {179, 0, 101, 255} }},
{{ {79, 39, -1}, 0, {-401, 27}, {178, 87, 206, 255} }},
{{ {79, 39, 4}, 0, {-102, 27}, {179, 87, 51, 255} }},
{{ {79, 35, -4}, 0, {-551, 157}, {178, 0, 156, 255} }},
{{ {79, 35, 6}, 0, {-938, 315}, {179, 0, 101, 255} }},
{{ {79, 30, 4}, 0, {-678, 315}, {155, 218, 66, 255} }},
{{ {196, 30, 3}, 0, {-678, -3197}, {0, 192, 110, 255} }},
{{ {196, 35, 6}, 0, {-938, -3197}, {0, 0, 127, 255} }},
{{ {79, 39, 4}, 0, {-1197, 315}, {179, 87, 51, 255} }},
{{ {79, 35, 6}, 0, {-938, 315}, {179, 0, 101, 255} }},
{{ {196, 35, 6}, 0, {-938, -3197}, {0, 0, 127, 255} }},
{{ {196, 39, 3}, 0, {-1197, -3197}, {0, 110, 63, 255} }},
{{ {79, 30, -1}, 0, {158, 315}, {154, 218, 190, 255} }},
{{ {196, 35, -4}, 0, {418, -3197}, {0, 0, 129, 255} }},
{{ {196, 30, -2}, 0, {158, -3197}, {0, 193, 146, 255} }},
{{ {79, 35, -4}, 0, {418, 315}, {178, 0, 156, 255} }},
{{ {196, 39, -2}, 0, {677, -3197}, {0, 110, 193, 255} }},
{{ {79, 39, -1}, 0, {677, 315}, {178, 87, 206, 255} }},
{{ {79, 39, -1}, 0, {-401, 315}, {178, 87, 206, 255} }},
{{ {79, 39, 4}, 0, {-102, 315}, {179, 87, 51, 255} }},
{{ {196, 39, 3}, 0, {-102, -3197}, {0, 110, 63, 255} }},
{{ {196, 39, -2}, 0, {-401, -3197}, {0, 110, 193, 255} }},
};
Gfx shotgun_Arm_mesh_layer_1_tri_2[] = {
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_2 + 0, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 3, 1, 0),
gsSP1Triangle(3, 4, 1, 0),
gsSP1Triangle(3, 5, 4, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 8, 9, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 12, 13, 0),
gsSP1Triangle(12, 14, 13, 0),
gsSP1Triangle(13, 15, 10, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_2 + 16, 16, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 3, 1, 0),
gsSP1Triangle(3, 4, 1, 0),
gsSP1Triangle(3, 5, 4, 0),
gsSP1Triangle(6, 7, 8, 0),
gsSP1Triangle(6, 8, 9, 0),
gsSP1Triangle(8, 10, 9, 0),
gsSP1Triangle(9, 11, 6, 0),
gsSP1Triangle(12, 13, 14, 0),
gsSP1Triangle(12, 14, 15, 0),
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_2 + 32, 14, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(0, 2, 3, 0),
gsSP1Triangle(4, 5, 6, 0),
gsSP1Triangle(4, 7, 5, 0),
gsSP1Triangle(7, 8, 5, 0),
gsSP1Triangle(7, 9, 8, 0),
gsSP1Triangle(10, 11, 12, 0),
gsSP1Triangle(10, 12, 13, 0),
gsSPEndDisplayList(),
};
Vtx shotgun_Arm_mesh_layer_1_vtx_3[10] = {
{{ {196, 30, 3}, 0, {-95, 799}, {127, 0, 0, 255} }},
{{ {196, 26, 6}, 0, {-170, 928}, {127, 0, 0, 255} }},
{{ {196, 22, 3}, 0, {-95, 1058}, {127, 0, 0, 255} }},
{{ {196, 26, -4}, 0, {129, 928}, {127, 0, 0, 255} }},
{{ {196, 22, -2}, 0, {55, 1058}, {127, 0, 0, 255} }},
{{ {196, 30, -2}, 0, {55, 799}, {127, 0, 0, 255} }},
{{ {196, 35, 6}, 0, {-170, 669}, {127, 0, 0, 255} }},
{{ {196, 39, -2}, 0, {55, 540}, {127, 0, 0, 255} }},
{{ {196, 35, -4}, 0, {129, 669}, {127, 0, 0, 255} }},
{{ {196, 39, 3}, 0, {-95, 540}, {127, 0, 0, 255} }},
};
Gfx shotgun_Arm_mesh_layer_1_tri_3[] = {
gsSPVertex(shotgun_Arm_mesh_layer_1_vtx_3 + 0, 10, 0),
gsSP1Triangle(0, 1, 2, 0),
gsSP1Triangle(2, 3, 0, 0),
gsSP1Triangle(2, 4, 3, 0),
gsSP1Triangle(3, 5, 0, 0),
gsSP1Triangle(6, 0, 5, 0),
gsSP1Triangle(5, 7, 6, 0),
gsSP1Triangle(5, 8, 7, 0),
gsSP1Triangle(7, 9, 6, 0),
gsSPEndDisplayList(),
};
Gfx mat_shotgun_wood[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(shotgun_wood_lights),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, shotgun_wood_rgba16),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0),
gsDPLoadBlock(7, 0, 0, 1023, 256),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0),
gsDPSetTileSize(0, 0, 0, 124, 124),
gsSPEndDisplayList(),
};
Gfx mat_shotgun_darkgray[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPSetLights1(shotgun_darkgray_lights),
gsSPEndDisplayList(),
};
Gfx mat_shotgun_metal[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT),
gsSPSetGeometryMode(G_TEXTURE_GEN),
gsSPTexture(4032, 1984, 0, 0, 1),
gsSPSetLights1(shotgun_metal_lights),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 1, shotgun_plat_rgba16),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b_LOAD_BLOCK, 0, 0, 7, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 0, 0),
gsDPLoadBlock(7, 0, 0, 2047, 128),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 16, 0, 0, 0, G_TX_WRAP | G_TX_NOMIRROR, 5, 0, G_TX_WRAP | G_TX_NOMIRROR, 6, 0),
gsDPSetTileSize(0, 0, 0, 252, 124),
gsSPEndDisplayList(),
};
Gfx mat_revert_shotgun_metal[] = {
gsDPPipeSync(),
gsSPClearGeometryMode(G_TEXTURE_GEN),
gsSPEndDisplayList(),
};
Gfx mat_shotgun_black_layer1[] = {
gsDPPipeSync(),
gsDPSetCombineLERP(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
gsDPSetRenderMode(G_RM_ZB_OPA_SURF, G_RM_ZB_OPA_SURF2),
gsSPTexture(65535, 65535, 0, 0, 1),
gsSPEndDisplayList(),
};
Gfx mat_revert_shotgun_black_layer1[] = {
gsDPPipeSync(),
gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2),
gsSPEndDisplayList(),
};
Gfx shotgun_Arm_mesh_layer_1[] = {
gsSPDisplayList(mat_shotgun_wood),
gsSPDisplayList(shotgun_Arm_mesh_layer_1_tri_0),
gsSPDisplayList(mat_shotgun_darkgray),
gsSPDisplayList(shotgun_Arm_mesh_layer_1_tri_1),
gsSPDisplayList(mat_shotgun_metal),
gsSPDisplayList(shotgun_Arm_mesh_layer_1_tri_2),
gsSPDisplayList(mat_revert_shotgun_metal),
gsSPDisplayList(mat_shotgun_black_layer1),
gsSPDisplayList(shotgun_Arm_mesh_layer_1_tri_3),
gsSPDisplayList(mat_revert_shotgun_black_layer1),
gsSPEndDisplayList(),
};
Gfx shotgun_material_revert_render_settings[] = {
gsDPPipeSync(),
gsSPSetGeometryMode(G_LIGHTING),
gsSPClearGeometryMode(G_TEXTURE_GEN),
gsDPSetCombineLERP(0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT, 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT),
gsSPTexture(65535, 65535, 0, 0, 0),
gsDPSetEnvColor(255, 255, 255, 255),
gsDPSetAlphaCompare(G_AC_NONE),
gsSPEndDisplayList(),
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

View file

@ -0,0 +1,7 @@
const GeoLayout troll_explosion_geo[] = {
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, troll_explosion),
GEO_CLOSE_NODE(),
GEO_END(),
};

View file

@ -0,0 +1,38 @@
static const Vtx explosion_seg3_vertex_030009C8[] = {
{{{ -128, -128, 0}, 0, { 0, 992}, {0xff, 0xff, 0xff, 0xff}}},
{{{ 128, -128, 0}, 0, { 992, 992}, {0xff, 0xff, 0xff, 0xff}}},
{{{ 128, 128, 0}, 0, { 992, 0}, {0xff, 0xff, 0xff, 0xff}}},
{{{ -128, 128, 0}, 0, { 0, 0}, {0xff, 0xff, 0xff, 0xff}}},
};
// 0x03000A08
ALIGNED8 const Texture troll_explosion_texture[] = {
#include "actors/troll_explosion/troll_explosion.rgba16.inc.c"
};
// 0x03004208 - 0x03004298
const Gfx explosion_seg3_dl_03004208[] = {
gsDPSetCombineMode(G_CC_DECALFADEA, G_CC_DECALFADEA),
gsDPSetEnvColor(255, 255, 255, 150),
gsSPClearGeometryMode(G_LIGHTING),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_CLAMP, 5, G_TX_NOLOD, G_TX_CLAMP, 5, G_TX_NOLOD),
gsDPLoadSync(),
gsDPLoadBlock(G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)),
gsDPSetTile(G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0, G_TX_RENDERTILE, 0, G_TX_CLAMP, 5, G_TX_NOLOD, G_TX_CLAMP, 5, G_TX_NOLOD),
gsDPSetTileSize(0, 0, 0, (32 - 1) << G_TEXTURE_IMAGE_FRAC, (32 - 1) << G_TEXTURE_IMAGE_FRAC),
gsSPVertex(explosion_seg3_vertex_030009C8, 4, 0),
gsSP2Triangles( 0, 1, 2, 0x0, 0, 2, 3, 0x0),
gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF),
gsDPPipeSync(),
gsSPSetGeometryMode(G_LIGHTING),
gsDPSetEnvColor(255, 255, 255, 255),
gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE),
gsSPEndDisplayList(),
};
const Gfx troll_explosion[] = {
gsDPPipeSync(),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, troll_explosion_texture),
gsSPBranchList(explosion_seg3_dl_03004208),
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

490
mods/gun-mod/b-bullet.lua Normal file
View file

@ -0,0 +1,490 @@
----------------------
-- bullet functions --
----------------------
--- @param obj Object
--- @return nil
function bullet_ricochet(obj)
if obj == nil then return end
-- ricochet
obj.oAction = 1
if obj.oVelY == 0 then
obj.oForwardVel = -obj.oForwardVel
else
obj.oVelX = -obj.oVelX
obj.oVelY = -obj.oVelY
obj.oVelZ = -obj.oVelZ
end
obj.oPosX = obj.header.gfx.prevPos.x
obj.oPosY = obj.header.gfx.prevPos.y
obj.oPosZ = obj.header.gfx.prevPos.z
audio_sample_play(SOUND_CUSTOM_RICOCHET, { x = obj.oPosX, y = obj.oPosY, z = obj.oPosZ }, 1)
end
--- @param obj Object
local function bullet_hit(obj)
spawn_mist_particles()
--[[if obj_count_objects_with_behavior_id(id_bhvBulletHole) < 100 then
local raycast = collision_find_surface_on_ray(obj.header.gfx.prevPos.x, obj.header.gfx.prevPos.y, obj.header.gfx.prevPos.z, obj.oVelX, obj.oVelY, obj.oVelZ)
if raycast.surface ~= nil and (cur_obj_detect_steep_floor(89) == 0 or cur_obj_detect_steep_floor(-89)) then
spawn_non_sync_object(
id_bhvBulletHole,
E_MODEL_BULLET_HOLE,
raycast.hitPos.x, raycast.hitPos.y, raycast.hitPos.z,
--- @param o Object
function(o)
o.parentObj = raycast.surface.object
end
)
end
end]]
obj_mark_for_deletion(obj)
end
---------------------------
-- hitbox hurt functions --
---------------------------
--- @param obj Object
--- @param bulletObj Object
function hurt_player(obj, bulletObj)
local m = gMarioStates[network_local_index_from_global(obj.globalPlayerIndex)]
if (m.flags & MARIO_METAL_CAP) ~= 0 then
bullet_ricochet(bulletObj)
play_sound(SOUND_GENERAL_METAL_POUND, m.marioObj.header.gfx.cameraToObject)
return false
elseif (m.flags & MARIO_VANISH_CAP) ~= 0 or m.invincTimer > 0 or (m.action & ACT_FLAG_INTANGIBLE) ~= 0 then
return false
else
packet_send(true, PACKET_ATTACK, { globalIndex = obj.globalPlayerIndex, weaponId = obj_get_weapon_id(bulletObj), yoshi = bulletObj.oAction == 2 })
end
return true
end
--- @param bulletObj Object
function hurt_star(_, bulletObj)
bullet_ricochet(bulletObj)
return false
end
--- @param obj Object
--- @param bulletObj Object
function hurt_sign(obj, bulletObj)
if obj.oGmHealth <= 0 or gWeaponTable[obj_get_weapon_id(bulletObj)].strong then
obj.oFaceAnglePitch = -0x4000
obj.oInteractType = 0
obj.hitboxRadius = 0
obj.hitboxHeight = 0
network_send_object(obj, false)
end
return true
end
--- @param obj Object
function hurt_toad(obj)
obj_spawn_yellow_coins(obj, 1)
obj_mark_for_deletion(obj)
network_send_object(obj, false)
return true
end
--- @param obj Object
function hurt_exclamation_box(obj)
if obj.oAction < 4 then
obj.oAction = 4
network_send_object(obj, true)
end
return true
end
--- @param obj Object
function hurt_breakable_box(obj)
if obj.oGmHealth <= 0 then
obj.oInteractStatus = INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED
network_send_object(obj, false)
end
return true
end
--- @param obj Object
function hurt_breakable_box_small(obj)
obj.oInteractStatus = ATTACK_KICK_OR_TRIP | INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED | INT_STATUS_STOP_RIDING
network_send_object(obj, false)
return true
end
--- @param obj Object
--- @param bulletObj Object
function hurt_bowling_ball(obj, bulletObj)
if obj.oGmHealth <= 0 or gWeaponTable[obj_get_weapon_id(bulletObj)].strong then
play_sound(SOUND_GENERAL_BREAK_BOX, obj.header.gfx.cameraToObject)
spawn_triangle_break_particles(30, 138, 3, 4)
obj_mark_for_deletion(obj)
end
return true
end
--- @param obj Object
function hurt_water_bomb(obj)
play_sound(SOUND_OBJ_DIVING_IN_WATER, obj.header.gfx.cameraToObject)
set_camera_shake_from_point(SHAKE_POS_SMALL, obj.oPosX, obj.oPosY, obj.oPosZ)
obj.oAction = WATER_BOMB_ACT_EXPLODE
return true
end
--- @param obj Object
--- @param bulletObj Object
function hurt_tree(obj, bulletObj)
for _ = 1, 10 do
spawn_non_sync_object(
id_bhvLeafParticleSpawner,
E_MODEL_NONE,
bulletObj.oPosX, bulletObj.oPosY, bulletObj.oPosZ,
nil
)
end
play_sound(SOUND_ACTION_CLIMB_UP_TREE, obj.header.gfx.cameraToObject)
return false
end
--- @param obj Object
--- @param bulletObj Object
function hurt_chain_chomp(obj, bulletObj)
if gWeaponTable[obj_get_weapon_id(bulletObj)].strong then
for _ = 1, 5 do
spawn_non_sync_object(
id_bhvExplosion,
E_MODEL_EXPLOSION,
obj.oPosX + math.random(-200, 200), obj.oPosY + 90 + math.random(-200, 200), obj.oPosZ + math.random(-200, 200),
nil
)
end
obj_mark_for_deletion(obj)
else
obj.oForwardVel = obj.oForwardVel - 5
obj.oVelY = -20
obj.oGravity = -4
end
network_send_object(obj, false)
play_sound(SOUND_GENERAL_CHAIN_CHOMP1, obj.header.gfx.cameraToObject)
return true
end
--- @param obj Object
--- @param bulletObj Object
function hurt_goomba(obj, bulletObj)
if gWeaponTable[obj_get_weapon_id(bulletObj)].strong then
obj.oInteractStatus = ATTACK_GROUND_POUND_OR_TWIRL | INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED
else
obj.oInteractStatus = ATTACK_KICK_OR_TRIP | INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED
end
network_send_object(obj, false)
return true
end
--- @param obj Object
function hurt_bobomb(obj)
if obj.oAction ~= BOBOMB_ACT_EXPLODE then
obj.oAction = BOBOMB_ACT_LAUNCHED
end
network_send_object(obj, false)
return true
end
--- @param obj Object
--- @param bulletObj Object
function hurt_amp(obj, bulletObj)
if gWeaponTable[obj_get_weapon_id(bulletObj)].strong then
play_sound(SOUND_GENERAL_BREAK_BOX, obj.header.gfx.cameraToObject)
spawn_triangle_break_particles(30, 138, 3, 4)
obj_mark_for_deletion(obj)
network_send_object(obj, false)
return true
else
bullet_ricochet(bulletObj)
play_sound(SOUND_ACTION_METAL_BONK, obj.header.gfx.cameraToObject)
end
return false
end
--- @param obj Object
function hurt_koopa(obj)
if obj.oKoopaMovementType == KOOPA_BP_UNSHELLED or obj.oKoopaMovementType == KOOPA_BP_NORMAL then
obj.oInteractStatus = ATTACK_KICK_OR_TRIP + (INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED)
network_send_object(obj, false)
end
return true
end
--- @param obj Object
function hurt_snufit(obj)
obj.oInteractStatus = ATTACK_PUNCH + (INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED)
network_send_object(obj, false)
return true
end
--- @param obj Object
function hurt_chuckya(obj)
obj_spawn_loot_yellow_coins(obj, 5, 20)
play_sound(SOUND_OBJ_CHUCKYA_DEATH, obj.header.gfx.cameraToObject)
obj_mark_for_deletion(obj)
network_send_object(obj, false)
return true
end
--- @param obj Object
function hurt_piranha_plant(obj)
obj.oAction = PIRANHA_PLANT_ACT_ATTACKED
stop_secondary_music(50)
network_send_object(obj, false)
return true
end
--- @param obj Object
function hurt_spindrift(obj)
obj.oInteractStatus = ATTACK_PUNCH + (INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED | INT_ATTACK_NOT_FROM_BELOW)
network_send_object(obj, false)
return true
end
--- @param obj Object
function hurt_mr_blizzard(obj)
play_sound(SOUND_OBJ_SNOWMAN_EXPLODE, obj.header.gfx.cameraToObject)
obj_mark_for_deletion(obj)
network_send_object(obj, false)
return true
end
--- @param obj Object
function hurt_scuttlebug(obj)
play_sound(SOUND_OBJ_DYING_ENEMY1, obj.header.gfx.cameraToObject)
obj_spawn_loot_yellow_coins(obj, obj.oNumLootCoins, 20)
obj_mark_for_deletion(obj)
network_send_object(obj, false)
return true
end
--- @param obj Object
function hurt_pokey(obj)
obj.oInteractStatus = ATTACK_PUNCH + (INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED)
return true
end
--- @param obj Object
function hurt_mr_i(obj)
obj.oAction = 3
network_send_object(obj, false)
return true
end
--- @param obj Object
--- @param bulletObj Object
function hurt_bully(obj, bulletObj)
obj.oAction = BULLY_ACT_KNOCKBACK
obj.oMoveAngleYaw = gMarioStates[network_local_index_from_global(obj_get_weapon_owner(bulletObj))].faceAngle.y
obj.oVelY = 30
obj.oForwardVel = if_then_else(gWeaponTable[obj_get_weapon_id(bulletObj)].strong, 30, 10)
obj.oInteractStatus = ATTACK_PUNCH + (INT_STATUS_INTERACTED | INT_STATUS_WAS_ATTACKED | INT_ATTACK_NOT_FROM_BELOW)
network_send_object(obj, false)
return true
end
--- @param obj Object
--- @param bulletObj Object
function hurt_king_bobomb(obj, bulletObj)
if (obj.oGmHealth <= 0 or gWeaponTable[obj_get_weapon_id(bulletObj)].strong) and obj.oHealth > 0 then
obj.oGmHealth = HEALTH_KING_BOBOMB
obj.oMoveFlags = obj.oMoveFlags | OBJ_MOVE_LANDED
obj.oAction = 4
network_send_object(obj, true)
end
return true
end
--- @param obj Object
function hurt_bowser(obj)
if obj.oGmHealth <= 0 and obj.oHealth > 0 then
obj.oGmHealth = HEALTH_BOWSER
obj.oHealth = obj.oHealth - 1
if obj.oHealth <= 0 then
obj.oAction = 4
else
obj.oAction = 12
end
network_send_object(obj, true)
end
return true
end
--- @param bulletObj Object
function hurt_yoshi(_, bulletObj)
bulletObj.oAction = 2
bullet_ricochet(bulletObj)
djui_chat_message_create("\\#a0ffa0\\Yoshi\\#dcdcdc\\: no lol")
play_sound(SOUND_MENU_MESSAGE_APPEAR, gGlobalSoundSource)
return false
end
-------------
-- objects --
-------------
--- @param o Object
local function bhv_debug_indicator_init(o)
o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
obj_set_billboard(o)
cur_obj_scale(0.5)
end
local function bhv_debug_indicator_loop(o)
if o.oTimer > 90 then obj_mark_for_deletion(o) end
end
id_bhvDebugIndicator = hook_behavior(nil, OBJ_LIST_UNIMPORTANT, true, bhv_debug_indicator_init, bhv_debug_indicator_loop)
--- @param o Object
local function bhv_bullet_init(o)
o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
o.oGraphYOffset = if_then_else(obj_has_model_extended(o, E_MODEL_YELLOW_COIN) ~= 0, -5, 0)
o.hitboxRadius = 20
o.hitboxHeight = 20
o.hitboxDownOffset = 10
o.oWallHitboxRadius = 30
o.oIntangibleTimer = 0
vec3f_set(o.header.gfx.pos, o.oPosX, o.oPosY, o.oPosZ)
obj_set_billboard(o)
cur_obj_scale(gWeaponTable[obj_get_weapon_id(o)].bulletScale)
cur_obj_hide()
network_init_object(o, true, {})
end
--- @param o Object
local function bhv_bullet_loop(o)
if o.oTimer > 150 then
obj_mark_for_deletion(o)
return
end
if o.oTimer == 1 then cur_obj_unhide() end
local prevPos = { x = o.oPosX, y = o.oPosY, z = o.oPosZ }
if o.oVelY == 0 then
cur_obj_move_xz_using_fvel_and_yaw()
else
cur_obj_move_using_vel()
end
cur_obj_update_floor_and_resolve_wall_collisions(0)
local marioObj = gMarioStates[network_local_index_from_global(obj_get_weapon_owner(o))].marioObj
local shootableHitboxes = gShootableHitboxes -- localizing saves microseconds
-- loop through every shootable behavior
for behavior, hurt in pairs(shootableHitboxes) do
-- get the nearest object with the current shootable behavior
local target = obj_get_nearest_object_with_behavior_id(o, behavior)
if target ~= nil then
-- check if the bullet (o) intersects with the target object (target)
local shot = obj_check_hitbox_overlap(target, o)
-- if not, begin using the substep system to see if hitboxes overlap then
local weapon = gWeaponTable[obj_get_weapon_id(o)]
if not shot then
local bulletSteps = weapon.bulletSteps
for i = 0, bulletSteps do
local step = i / bulletSteps
-- go from the previous position of the bullet to the current one over bullet steps
local x = lerp(prevPos.x, o.oPosX, step)
local y = lerp(prevPos.y, o.oPosY, step)
local z = lerp(prevPos.z, o.oPosZ, step)
-- spawn_non_sync_object(id_bhvDebugIndicator, E_MODEL_RED_COIN_NO_SHADOW, x, y, z, nil)
-- check if the bullet (o) now intersects with target object (target)
shot = obj_check_hitbox_overlap_xyz(target, o, x, y, z)
-- hit target and break out of loop if so, otherwise continue
if shot and (marioObj._pointer ~= target._pointer or o.oAction > 0) then
target.oGmHealth = target.oGmHealth - weapon.damage
if hurt ~= nil and hurt(target, o) then
bullet_hit(o)
return
end
break
end
end
elseif marioObj._pointer ~= target._pointer or o.oAction > 0 then
target.oGmHealth = target.oGmHealth - weapon.damage
if hurt ~= nil and hurt(target, o) then
bullet_hit(o)
return
end
break
end
end
end
-- spawn_non_sync_object(id_bhvDebugIndicator, E_MODEL_YELLOW_COIN_NO_SHADOW, prevPos.x, prevPos.y, prevPos.z, nil)
-- spawn_non_sync_object(id_bhvDebugIndicator, E_MODEL_YELLOW_COIN_NO_SHADOW, o.oPosX, o.oPosY, o.oPosZ, nil)
local raycast = collision_find_surface_on_ray(prevPos.x, prevPos.y, prevPos.z, o.oPosX - prevPos.x, o.oPosY - prevPos.y, o.oPosZ - prevPos.z)
if raycast.surface ~= nil or (o.oMoveFlags & OBJ_MOVE_HIT_WALL) ~= 0 then
vec3f_to_object_pos(o, raycast.hitPos)
bullet_hit(o)
end
end
id_bhvBullet = hook_behavior(nil, OBJ_LIST_UNIMPORTANT, true, bhv_bullet_init, bhv_bullet_loop, "bhvGmBullet")
--- @param o Object
local function bhv_bullet_hole_init(o)
o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
end
--- @param o Object
local function bhv_bullet_hole_loop(o)
cur_obj_align_gfx_with_floor()
if o.oTimer == 450 then obj_mark_for_deletion(o) end
end
id_bhvBulletHole = hook_behavior(nil, OBJ_LIST_UNIMPORTANT, true, bhv_bullet_hole_init, bhv_bullet_hole_loop, "bhvGmBulletHole")
function spawn_bullets_player(x, y, z, count)
local weapon = cur_weapon()
if weapon == nil then return end
--- @type MarioState
local m = gMarioStates[0]
for _ = 1, count do
local spread = math.random() * weapon.spread
spawn_sync_object(
id_bhvBullet,
weapon.bulletModel,
x + spread, y + spread, z + spread,
--- @param o Object
function(o)
obj_set_weapon_params(o, gNetworkPlayers[0].globalIndex, weapon.id, 0, 0)
local enabled = get_first_person_enabled()
o.oFaceAngleYaw = if_then_else(enabled, m.area.camera.yaw + 0x8000, m.faceAngle.y)
o.oForwardVel = weapon.bulletSpeed
if enabled or (m.input & INPUT_FIRST_PERSON) ~= 0 then
-- thanks Peachy
local dx = m.area.camera.focus.x - m.area.camera.pos.x
local dy = m.area.camera.focus.y - m.area.camera.pos.y
local dz = m.area.camera.focus.z - m.area.camera.pos.z
local dv = math.sqrt(dx * dx + dy * dy + dz * dz)
o.oVelX = weapon.bulletSpeed * (dx / dv)
o.oVelY = weapon.bulletSpeed * (dy / dv)
o.oVelZ = weapon.bulletSpeed * (dz / dv)
end
end
)
end
end

89
mods/gun-mod/b-gun.lua Normal file
View file

@ -0,0 +1,89 @@
if SM64COOPDX_VERSION == nil then return end
--- @param weapon Weapon
--- @return nil
function common_shoot(weapon)
--- @type MarioState
local m = gMarioStates[0]
if not weapon.reqCheck(m) then return end
if weapon.ammo <= 0 and weapon.maxAmmo > 0 then
audio_sample_play(SOUND_CUSTOM_DRY, gMarioStates[0].pos, 1)
return
end
local enabled = get_first_person_enabled()
local x = if_then_else(enabled, gLakituState.pos.x, m.pos.x)
local y = if_then_else(enabled, gLakituState.pos.y, m.pos.y + FIRST_PERSON_MARIO_HEAD_POS_SHORT)
local z = if_then_else(enabled, gLakituState.pos.z, m.pos.z)
spawn_bullets_player(x, y, z, weapon.bulletCount)
if #weapon.primarySounds > 0 then
sync_audio_sample_play(weapon.primarySounds[math.random(#weapon.primarySounds)], gMarioStates[0].pos, 1)
end
if weapon.maxAmmo > 0 then
weapon.ammo = weapon.ammo - 1
if weapon.ammo == 0 then common_reload(weapon) end
end
useDualWieldWeapon = not useDualWieldWeapon
end
--- @param weapon Weapon
--- @return nil
function common_reload(weapon)
--- @type MarioState
local m = gMarioStates[0]
if weapon.reloadTimer > 0 or not weapon.reqCheck(m) then return end
local weapon2 = if_then_else(useDualWieldWeapon, cur_weapon(), cur_dual_wield_weapon())
if weapon.ammo >= weapon.maxAmmo then
weapon.cooldownTimer = 0
if weapon2 ~= nil then
if weapon2.ammo >= weapon2.maxAmmo then
weapon2.cooldownTimer = 0
else
if #weapon.secondarySounds > 0 then
sync_audio_sample_play(weapon.secondarySounds[math.random(#weapon.secondarySounds)], m.pos, 1)
end
weapon2.ammo = 0
weapon2.reloadTimer = weapon2.reloadTime
end
end
return
end
if weapon2 ~= nil then
if weapon2.ammo >= weapon2.maxAmmo then
weapon2.cooldownTimer = 0
else
if #weapon.secondarySounds > 0 then
sync_audio_sample_play(weapon.secondarySounds[math.random(#weapon.secondarySounds)], m.pos, 1)
end
weapon2.ammo = 0
weapon2.reloadTimer = weapon2.reloadTime
end
end
if #weapon.secondarySounds > 0 then
sync_audio_sample_play(weapon.secondarySounds[math.random(#weapon.secondarySounds)], m.pos, 1)
end
weapon.ammo = 0
weapon.reloadTimer = weapon.reloadTime
end
--- @param m MarioState
function check_common_gun_requirements(m)
return m.health > 0xFF and
m.action ~= ACT_STAR_DANCE_EXIT and
m.action ~= ACT_STAR_DANCE_NO_EXIT and
m.action ~= ACT_STAR_DANCE_WATER and
m.action ~= ACT_LEDGE_GRAB and
m.action ~= ACT_LEDGE_CLIMB_FAST and
m.action ~= ACT_LEDGE_CLIMB_SLOW_1 and
m.action ~= ACT_LEDGE_CLIMB_SLOW_2 and
(m.action & ACT_GROUP_MASK) ~= ACT_GROUP_SUBMERGED and
m.action ~= ACT_DISAPPEARED
end

View file

@ -0,0 +1,42 @@
local seen = false
--- @param o Object
local function bhv_dialog_arrow_init(o)
o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
o.parentObj = obj_get_nearest_object_with_behavior_id(o, id_bhvMessagePanel)
if o.parentObj == nil then
obj_mark_for_deletion(o)
return
end
o.oDrawingDistance = o.parentObj.oDrawingDistance
o.oPosX = o.parentObj.oPosX
o.oPosY = o.parentObj.oPosY + 150
o.oPosZ = o.parentObj.oPosZ
end
--- @param o Object
local function bhv_dialog_arrow_loop(o)
o.oGraphYOffset = math.sin(o.oTimer * 0.1) * 20
if gMarioStates[0].interactObj == o.parentObj then
seen = true
obj_mark_for_deletion(o)
elseif o.parentObj.oInteractType == 0 then
obj_mark_for_deletion(o)
end
end
local id_bhvDialogArrow = hook_behavior(nil, OBJ_LIST_UNIMPORTANT, true, bhv_dialog_arrow_init, bhv_dialog_arrow_loop)
function spawn_dialog_arrow()
if gNetworkPlayers[0].currLevelNum ~= LEVEL_CASTLE_GROUNDS or not level_is_vanilla_level(LEVEL_CASTLE_GROUNDS) or seen then return end
spawn_non_sync_object(
id_bhvDialogArrow,
E_MODEL_ARROW,
-1567, 386, 3492,
nil
)
end

View file

@ -0,0 +1,96 @@
smlua_anim_util_register_animation("arm_idle",
0,
189,
0,
0,
60,
{
0x0000, 0xFFDD, 0x0000, 0x0000, 0x0000, 0xDFFF, 0xE000, 0xE002, 0xE006,
0xE00B, 0xE011, 0xE019, 0xE021, 0xE02A, 0xE034, 0xE03F, 0xE04A, 0xE056,
0xE061, 0xE06E, 0xE07A, 0xE086, 0xE092, 0xE09E, 0xE0AA, 0xE0B5, 0xE0C0,
0xE0CA, 0xE0D3, 0xE0DB, 0xE0E2, 0xE0E9, 0xE0EE, 0xE0F1, 0xE0F4, 0xE0F5,
0xE0F4, 0xE0F1, 0xE0EE, 0xE0E9, 0xE0E2, 0xE0DB, 0xE0D3, 0xE0CA, 0xE0C0,
0xE0B5, 0xE0AA, 0xE09E, 0xE092, 0xE086, 0xE07A, 0xE06E, 0xE061, 0xE056,
0xE04A, 0xE03F, 0xE034, 0xE02A, 0xE021, 0xE019, 0xE011, 0xE00B, 0xE006,
0xE002, 0xE000, 0xDFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0x0000, 0xFFFF,
0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0x0000, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF,
0x0000, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0xFFFF, 0x0000,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0xFFFF, 0x0000,
0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x2000,
},
{
0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0003, 0x0001,
0x0004, 0x003D, 0x0005, 0x003D, 0x0042, 0x003D, 0x007F, 0x0001, 0x00BC,
}
)
smlua_anim_util_register_animation("arm_reload_start",
1,
189,
0,
0,
15,
{
0x0000, 0xFFE7, 0x0000, 0x0000, 0x0000, 0xDFFF, 0xE178, 0xE4FF, 0xE938,
0xECBF, 0xEE38, 0xECF3, 0xE973, 0xE428, 0xDD93, 0xD64E, 0xCF09, 0xC874,
0xC32A, 0xBFA9, 0xBE64, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0x0000, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0xFFFF,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF,
0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0x0000, 0x2000, 0x2000,
0x2000, 0x2000, 0x2000, 0x2000, 0x1F2B, 0x1CE6, 0x1984, 0x155F, 0x10D5,
0x0C4C, 0x0826, 0x04C5, 0x027F, 0x01AA,
},
{
0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0003, 0x0001,
0x0004, 0x0010, 0x0005, 0x000F, 0x0015, 0x0010, 0x0024, 0x0010, 0x0034,
}
)
smlua_anim_util_register_animation("arm_reload_end",
1,
189,
0,
0,
15,
{
0x0000, 0xFFDD, 0x0000, 0x0000, 0x0000, 0xBE64, 0xBECF, 0xBFFC, 0xC1D1,
0xC432, 0xC704, 0xCA28, 0xCD7E, 0xD0E5, 0xD43C, 0xD760, 0xDA31, 0xDC92,
0xDE67, 0xDF94, 0xDFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0xFFFF,
0x0000, 0x0000, 0x0000, 0x0000, 0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0x0000,
0x0000, 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0xFFFF, 0x0000, 0xFFFF,
0xFFFF, 0xFFFF, 0x0000, 0xFD70, 0xFDDE, 0xFF13, 0x00F6, 0x0368, 0x064E,
0x0989, 0x0CF8, 0x1079, 0x13E8, 0x1723, 0x1A09, 0x1C7B, 0x1E5D, 0x1F92,
0x2000,
},
{
0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0003, 0x0001,
0x0004, 0x0010, 0x0005, 0x000C, 0x0015, 0x000F, 0x0021, 0x0010, 0x0030,
}
)
smlua_anim_util_register_animation("arm_shoot",
1,
189,
0,
0,
8,
{
0x0000, 0xFFDD, 0x0000, 0x0000, 0x0000, 0xDFFF, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF,
0x0000, 0xFFFF, 0x0000, 0x2000, 0x21AA, 0x2555, 0x2901, 0x2AAB, 0x2901,
0x2555, 0x21AA, 0x2000,
},
{
0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0003, 0x0001,
0x0004, 0x0001, 0x0005, 0x0007, 0x0006, 0x0008, 0x000D, 0x0009, 0x0015,
}
)

View file

@ -0,0 +1,134 @@
if SM64COOPDX_VERSION == nil then return end
local CAP_FLICKER_FRAMES = 0x4444449249255555 -- this is beyond my comprehension
gFirstPersonViewmodels = {
armObjs = { nil, nil },
gunObjs = { nil, nil }
}
--- @param o Object
local function bhv_viewmodel_init(o)
o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
end
--- @param o Object
local function bhv_viewmodel_loop(o)
if not gGlobalSyncTable.gunModEnabled or not get_first_person_enabled() then
obj_mark_for_deletion(o)
return
end
local dualWield = obj_get_weapon_dual_wield(o) ~= 0
--- @type Weapon
local weapon = if_then_else(dualWield, cur_dual_wield_weapon(), cur_weapon())
if not weapon.reqCheck(gMarioStates[0]) then
cur_obj_hide()
else
cur_obj_unhide()
end
local horizontalOffset = 30
if cur_dual_wield_weapon() ~= nil then
horizontalOffset = if_then_else(obj_get_weapon_dual_wield(o) ~= 0, -50, 50)
end
-- math to calculate staying in the same screen position no matter what
o.oPosX = gLakituState.pos.x - 35 * coss(gFirstPersonCamera.pitch) * sins(gFirstPersonCamera.yaw)
o.oPosY = gLakituState.pos.y - 35 * sins(gFirstPersonCamera.pitch)
o.oPosZ = gLakituState.pos.z - 35 * coss(gFirstPersonCamera.pitch) * coss(gFirstPersonCamera.yaw)
-- math to offset it to the left or right
o.oPosX = o.oPosX + sins(gFirstPersonCamera.yaw + 0x4000) * horizontalOffset
o.oPosZ = o.oPosZ + coss(gFirstPersonCamera.yaw + 0x4000) * horizontalOffset
o.oFaceAnglePitch = 0
o.oFaceAngleYaw = gFirstPersonCamera.yaw + 0x4000
o.oFaceAngleRoll = -gFirstPersonCamera.pitch
if weapon ~= nil then
if weapon.deployTimer > 0 then
obj_set_animation(o, "arm_reload_end")
-- freeze animation if the time hasn't come to show the arm rising up
if o.header.gfx.animInfo.animFrame > 0 and weapon.deployTimer - o.header.gfx.animInfo.curAnim.loopEnd > 0 then
o.header.gfx.animInfo.animFrame = 0
end
else
local half = math.floor(weapon.reloadTime * 0.5)
if weapon.reloadTimer <= 0 then
if weapon.cooldownTimer > 0 then
obj_set_animation(o, "arm_shoot")
else
obj_set_animation(o, "arm_idle")
-- *try* keep both arms in sync
if dualWield then
o.header.gfx.animInfo.animFrame = gFirstPersonViewmodels.armObjs[1].header.gfx.animInfo.animFrame
end
end
elseif weapon.reloadTimer < half then
obj_set_animation(o, "arm_reload_end")
else
obj_set_animation(o, "arm_reload_start")
end
end
end
o.globalPlayerIndex = gNetworkPlayers[0].globalIndex
--- @type MarioState
local m = gMarioStates[0]
if m.capTimer < 64 and ((1 << m.capTimer) & CAP_FLICKER_FRAMES) ~= 0 then
o.oAnimState = 0
else
local vanishCap = if_then_else((gMarioStates[0].flags & MARIO_VANISH_CAP) ~= 0, 2, 0)
local metalCap = if_then_else((gMarioStates[0].flags & MARIO_METAL_CAP) ~= 0, 1, 0)
o.oAnimState = metalCap + vanishCap
end
end
id_bhvViewmodel = hook_behavior(nil, OBJ_LIST_GENACTOR, true, bhv_viewmodel_init, bhv_viewmodel_loop, "bhvGmViewmodel")
--- @param weapon Weapon
local function spawn_viewmodel(weapon, dualWield)
local index = if_then_else(dualWield, 1, 2)
dualWield = if_then_else(dualWield, 1, 0)
gFirstPersonViewmodels.armObjs[index] = spawn_non_sync_object(
id_bhvViewmodel,
weapon.armModel,
0, -10000, 0,
--- @param o Object
function(o)
obj_set_weapon_params(o, 0, 0, dualWield, 0)
end
)
gFirstPersonViewmodels.gunObjs[index] = spawn_non_sync_object(
id_bhvViewmodel,
weapon.model,
0, -10000, 0,
--- @param o Object
function(o)
obj_set_weapon_params(o, 0, 0, dualWield, 0)
end
)
end
function spawn_viewmodels()
local weapon1 = cur_weapon()
local weapon2 = cur_dual_wield_weapon()
if weapon1 == nil then return end
spawn_viewmodel(weapon1, false)
if weapon2 ~= nil then spawn_viewmodel(weapon2, true) end
end
function delete_viewmodels()
gFirstPersonViewmodels.armObjs[1] = obj_mark_for_deletion(gFirstPersonViewmodels.armObjs[1])
gFirstPersonViewmodels.armObjs[2] = obj_mark_for_deletion(gFirstPersonViewmodels.armObjs[2])
gFirstPersonViewmodels.gunObjs[1] = obj_mark_for_deletion(gFirstPersonViewmodels.gunObjs[1])
gFirstPersonViewmodels.gunObjs[2] = obj_mark_for_deletion(gFirstPersonViewmodels.gunObjs[2])
end

593
mods/gun-mod/c-weapon.lua Normal file
View file

@ -0,0 +1,593 @@
if SM64COOPDX_VERSION == nil then return end
---------------------------------------
-- API and other important functions --
---------------------------------------
--- @class Weapon
--- @field public id integer
--- @field public name string
--- @field public dualWield boolean
--- @field public model ModelExtendedId
--- @field public armModel ModelExtendedId
--- @field public bulletModel ModelExtendedId
--- @field public primarySounds integer[]
--- @field public secondarySounds integer[]
--- @field public strong boolean
--- @field public rapidFire boolean
--- @field public spread number
--- @field public damage number
--- @field public bulletCount integer
--- @field public bulletScale number
--- @field public bulletSpeed number
--- @field public bulletSteps integer
--- @field public maxAmmo integer
--- @field public ammo integer
--- @field public deployTime integer
--- @field public cooldownTime integer
--- @field public reloadTime integer
--- @field public deployTimer integer
--- @field public cooldownTimer integer
--- @field public reloadTimer integer
--- @field public primaryFireFunc fun(weapon:Weapon)
--- @field public secondaryFireFunc fun(weapon:Weapon)
--- @field public reqCheck fun(m:MarioState)
--- @class WeaponId
--- @type Weapon[]
gWeaponTable = {}
--- @type Weapon[]
gInventory = {}
for i = 1, MAX_INVENTORY_SLOTS do gInventory[i] = nil end
inventorySlot = 1
useDualWieldWeapon = false
local weaponObtained = false
local weaponId = -1
local sMutableWeaponFields = {
["ammo"] = true,
["deployTimer"] = true,
["cooldownTimer"] = true,
["reloadTimer"] = true
}
local sReadonlyMetatable = {
__index = function(table, key)
return rawget(table, key)
end,
__newindex = function()
error("attempt to update a read-only table", 2)
end
}
local sWeaponMetatable = {
__index = function(table, key)
return rawget(table, key)
end,
__newindex = function(table, key, value)
if sMutableWeaponFields[key] then
rawset(table, key, value)
else
error("attempt to update an immutable weapon field", 2)
end
end
}
--- @param name string
--- @param dualWield boolean
--- @param model ModelExtendedId
--- @param armModel ModelExtendedId
--- @param bulletModel ModelExtendedId
--- @param primarySounds integer[]
--- @param secondarySounds integer[]
--- @param strong boolean
--- @param rapidFire boolean
--- @param spread number
--- @param damage number
--- @param bulletCount integer
--- @param bulletScale number
--- @param bulletSpeed number
--- @param bulletSteps integer
--- @param maxAmmo integer
--- @param deployTime integer
--- @param cooldownTime integer
--- @param reloadTime integer
--- @param primaryFireFunc fun(weapon:Weapon)
--- @param secondaryFireFunc fun(weapon:Weapon)
--- @param reqCheck function
--- @return integer
--- Registers a weapon metatable into existence
function weapon_register(name, dualWield, model, armModel, bulletModel, primarySounds, secondarySounds, strong, rapidFire, spread, damage, bulletCount, bulletScale, bulletSpeed, bulletSteps, maxAmmo, deployTime, cooldownTime, reloadTime, primaryFireFunc, secondaryFireFunc, reqCheck)
weaponId = weaponId + 1
gWeaponTable[weaponId] = {
id = weaponId,
name = name,
dualWield = dualWield,
model = model,
armModel = armModel,
bulletModel = bulletModel,
primarySounds = primarySounds,
secondarySounds = secondarySounds,
strong = strong,
rapidFire = rapidFire,
spread = spread,
damage = damage,
bulletCount = bulletCount,
bulletScale = bulletScale,
bulletSpeed = bulletSpeed,
bulletSteps = bulletSteps,
maxAmmo = maxAmmo,
ammo = maxAmmo,
deployTime = deployTime,
cooldownTime = cooldownTime,
reloadTime = reloadTime,
deployTimer = deployTime,
cooldownTimer = 0,
reloadTimer = 0,
primaryFireFunc = primaryFireFunc,
secondaryFireFunc = secondaryFireFunc,
reqCheck = reqCheck
}
setmetatable(gWeaponTable[weaponId], sReadonlyMetatable)
return weaponId
end
--- @param id integer
--- @return nil
--- Unregisters a weapon from existence by ID
function weapon_unregister(id)
if type(id) ~= "number" then return end
gWeaponTable[id] = nil
end
--- @return nil
--- Unregisters all weapons from existence
function weapon_unregister_all()
gWeaponTable = {}
end
--- @return string
--- Properly formatted weapon list string for commands
function get_weapon_list_string()
local string = "["
for id, weapon in pairs(gWeaponTable) do
string = string .. weapon.name:lower()
if id < weaponId then
string = string .. "|"
end
end
string = string .. "]"
return string
end
--- @param obj Object
--- @param owner integer
--- @param id integer
--- @param dualWield integer
--- @param extra integer
--- @return nil
--- Returns a 4 byte behavior parameter integer for weapon objects.
function obj_set_weapon_params(obj, owner, id, dualWield, extra)
if obj == nil then return end
if type(owner) ~= "number" or type(id) ~= "number" or type(dualWield) ~= "number" or type(extra) ~= "number" then return end
obj.oBehParams = owner | (id << 8) | (dualWield << 16) | (extra << 24)
obj.oBehParams2ndByte = id
end
--- @param obj Object
--- @return integer
--- Returns the owner parameter (first parameter) of a weapon object.
function obj_get_weapon_owner(obj)
if obj == nil then return 0 end
return obj.oBehParams & 0xFF
end
--- @param obj Object
--- @return integer
--- Returns the id parameter (second parameter) of a weapon object.
function obj_get_weapon_id(obj)
if obj == nil then return 0 end
return obj.oBehParams2ndByte
end
--- @param obj Object
--- @return integer
--- Returns the dual wield parameter (third parameter) of a weapon object.
function obj_get_weapon_dual_wield(obj)
if obj == nil then return 0 end
return (obj.oBehParams >> 16) & 0xFF
end
--- @param obj Object
--- @return integer
--- Returns the extra parameter (fourth parameter) of a weapon object.
function obj_get_weapon_extra(obj)
if obj == nil then return 0 end
return (obj.oBehParams >> 24) & 0xFF
end
--- @return Weapon|nil
--- Returns the table of the current weapon
function cur_weapon()
return gInventory[inventorySlot]
end
--- @return Weapon|nil
--- Returns the table of the current dual wielding weapon
function cur_dual_wield_weapon()
local weapon = cur_weapon()
if weapon == nil or not weapon.dualWield then return nil end
local weaponBefore = gInventory[inventorySlot - 1]
if weaponBefore ~= nil and weaponBefore.dualWield and weaponBefore.id == weapon.id then return weaponBefore end
local weaponAfter = gInventory[inventorySlot + 1]
if weaponAfter ~= nil and weaponAfter.dualWield and weaponAfter.id == weapon.id then return weaponAfter end
return nil
end
--- @return integer
--- Returns the current inventory slot
function get_inventory_slot()
return inventorySlot
end
--- @param slot integer
--- @return nil
--- Sets the current inventory slot
function set_inventory_slot(slot)
if type(slot) ~= "number" then return end
-- reset fields
gInventory[slot].deployTimer = gInventory[slot].deployTime
gInventory[slot].cooldownTimer = 0
gInventory[slot].reloadTimer = if_then_else(gInventory[slot].ammo <= 0 and gInventory[slot].maxAmmo > 0, gInventory[slot].reloadTime, 0)
inventorySlot = clamp(slot, 1, MAX_INVENTORY_SLOTS)
sync_current_weapons()
delete_held_weapon()
if get_first_person_enabled() then
delete_viewmodels()
spawn_viewmodels()
end
end
local function table_clone(table)
local cloned = {}
for k, v in pairs(table) do
if type(v) == "table" then
cloned[k] = table_clone(v)
else
cloned[k] = v
end
end
return cloned
end
--- @param weapon WeaponId
local function inventory_clone(weapon)
local table = table_clone(gWeaponTable[weapon])
setmetatable(table, sWeaponMetatable)
return table
end
local function get_inventory_slots_used()
local count = 0
for i = 1, MAX_INVENTORY_SLOTS do
if gInventory[i] ~= nil then
count = count + 1
end
end
return count
end
--- @param weapon WeaponId
--- @return boolean
--- Picks up a weapon by ID
function pickup_weapon(weapon)
if type(weapon) ~= "number" then return false end
for i = 1, MAX_INVENTORY_SLOTS do
if gInventory[i] == weapon then
return false
elseif gInventory[i] == nil or get_inventory_slots_used() == MAX_INVENTORY_SLOTS then
if not weaponObtained then
play_sound(SOUND_MENU_STAR_SOUND, gMarioStates[0].marioObj.header.gfx.cameraToObject)
weaponObtained = true
else
play_sound(SOUND_MENU_CLICK_CHANGE_VIEW, gMarioStates[0].marioObj.header.gfx.cameraToObject)
end
gInventory[i] = inventory_clone(weapon)
set_inventory_slot(i)
return true
end
end
return false
end
function sync_current_weapons()
gPlayerSyncTable[0].curWeapon = nil
gPlayerSyncTable[0].curWeapon2 = nil
local weapon = cur_weapon()
if weapon ~= nil then
gPlayerSyncTable[0].curWeapon = weapon.id
end
local weapon2 = cur_dual_wield_weapon()
if weapon2 ~= nil then
gPlayerSyncTable[0].curWeapon2 = weapon2.id
end
end
--- @param weapon Weapon
function handle_reloading(weapon)
if weapon == nil then return end
if weapon.reloadTimer > 0 then
weapon.reloadTimer = weapon.reloadTimer - 1
if weapon.name == "Shotgun" then
weapon.ammo = math.floor(lerp(weapon.maxAmmo, 0, weapon.reloadTimer / weapon.reloadTime))
end
if weapon.reloadTimer == 0 then
weapon.ammo = weapon.maxAmmo
end
end
end
function weapon_update()
--- @type MarioState
local m = gMarioStates[0]
-- update inventory slot
if (m.controller.buttonPressed & U_JPAD) ~= 0 then
inventorySlot = inventorySlot + 1
if inventorySlot > MAX_INVENTORY_SLOTS then
inventorySlot = 1
end
set_inventory_slot(inventorySlot)
elseif (m.controller.buttonPressed & D_JPAD) ~= 0 then
inventorySlot = inventorySlot - 1
if inventorySlot < 1 then
inventorySlot = MAX_INVENTORY_SLOTS
end
set_inventory_slot(inventorySlot)
end
local weapon1 = cur_weapon()
local weapon2 = cur_dual_wield_weapon()
--- @type Weapon
local weapon = if_then_else(weapon2 ~= nil and useDualWieldWeapon, weapon2, weapon1)
if weapon1 == nil then return end -- if the player isn't holding a weapon
if weapon.deployTimer <= 0 and weapon.cooldownTimer <= 0 then
local buttonFlags = if_then_else(weapon.rapidFire, m.controller.buttonDown, m.controller.buttonPressed)
if (buttonFlags & Y_BUTTON) ~= 0 and weapon.primaryFireFunc ~= nil then
weapon.cooldownTimer = weapon.cooldownTime
weapon.primaryFireFunc(weapon)
elseif (buttonFlags & X_BUTTON) ~= 0 and weapon.secondaryFireFunc ~= nil then
weapon.cooldownTimer = weapon.cooldownTime
weapon.secondaryFireFunc(weapon)
end
end
weapon1.deployTimer = handle_timer(weapon1.deployTimer)
weapon1.cooldownTimer = handle_timer(weapon1.cooldownTimer)
if weapon2 ~= nil then
weapon2.deployTimer = handle_timer(weapon2.deployTimer)
weapon2.cooldownTimer = handle_timer(weapon2.cooldownTimer)
end
handle_reloading(weapon1)
handle_reloading(weapon2)
end
function delete_held_weapon()
local held = obj_get_first_with_behavior_id(id_bhvHeldWeapon)
while held ~= nil do
if obj_get_weapon_owner(held) == gNetworkPlayers[0].globalIndex then
obj_mark_for_deletion(held)
end
held = obj_get_next_with_same_behavior_id(held)
end
end
-------------
-- objects --
-------------
--- @param o Object
local function bhv_held_weapon_init(o)
o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
o.oGraphYOffset = 10
cur_obj_scale(0.6)
cur_obj_hide()
end
--- @param o Object
local function bhv_held_weapon_loop(o)
local np = network_player_from_global_index(obj_get_weapon_owner(o))
if np == nil or not gGlobalSyncTable.gunModEnabled then
obj_mark_for_deletion(o)
return
end
local m = gMarioStates[np.localIndex]
local dualWield = obj_get_weapon_dual_wield(o)
--- @type Weapon|nil
local weapon = if_then_else(dualWield ~= 0, cur_dual_wield_weapon(), cur_weapon())
if active_player(m) == 0 or weapon == nil then
obj_mark_for_deletion(o)
return
end
local index = if_then_else(dualWield ~= 0, 1, 0)
if m.marioBodyState.updateTorsoTime == gMarioStates[0].marioBodyState.updateTorsoTime and m.marioBodyState.handState == MARIO_HAND_FISTS and weapon.reqCheck(m) then
cur_obj_unhide()
o.oPosX = get_hand_foot_pos_x(m, index) + m.vel.x - (sins(m.faceAngle.y) * 30)
o.oPosY = get_hand_foot_pos_y(m, index) + m.vel.y + if_then_else(m.action == ACT_JUMP or m.action == ACT_DOUBLE_JUMP, 20, 0)
o.oPosZ = get_hand_foot_pos_z(m, index) + m.vel.z - (coss(m.faceAngle.y) * 30)
o.oFaceAngleYaw = m.faceAngle.y - 0x4000
o.oFaceAnglePitch = 0
o.oFaceAngleRoll = 0
else
cur_obj_hide()
o.oPosX = m.pos.x
o.oPosY = m.pos.y + 60
o.oPosZ = m.pos.z
end
if m.playerIndex == 0 and get_first_person_enabled() then
cur_obj_hide()
end
obj_set_model_extended(o, weapon.model)
end
id_bhvHeldWeapon = hook_behavior(nil, OBJ_LIST_GENACTOR, true, bhv_held_weapon_init, bhv_held_weapon_loop, "bhvGmHeldWeapon")
--- @param o Object
local function bhv_pickup_weapon_init(o)
o.oFlags = OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE
o.oIntangibleTimer = 0
obj_scale(o, 0.75)
o.hitboxRadius = 90
o.hitboxHeight = 90
network_init_object(o, true, {})
end
--- @param o Object
local function bhv_pickup_weapon_loop(o)
cur_obj_update_floor_height()
o.oPosY = o.oFloorHeight + 130
o.oFaceAngleYaw = o.oFaceAngleYaw + 0x800
local nearest = nearest_mario_state_to_object(o)
if obj_check_hitbox_overlap(o, nearest.marioObj) and o.oIntangibleTimer == 0 and nearest.playerIndex == 0 then
o.oIntangibleTimer = 450
pickup_weapon(o.oBehParams)
end
if o.oIntangibleTimer ~= 0 then
cur_obj_hide()
else
cur_obj_unhide()
o.oGraphYOffset = math.sin(o.oTimer * 0.5) * 5
end
end
id_bhvWeaponPickup = hook_behavior(nil, OBJ_LIST_LEVEL, true, bhv_pickup_weapon_init, bhv_pickup_weapon_loop, "bhvGmWeaponPickup")
-------------
-- weapons --
-------------
WEAPON_PISTOL = weapon_register(
"Pistol", -- name
true, -- dual wieldable
E_MODEL_PISTOL, -- weapon model
E_MODEL_SINGLE_ARM, -- arm model
E_MODEL_YELLOW_COIN, -- bullet model
{ sync_audio_sample_load("pistol_shoot.mp3") }, -- primary sounds
{ sync_audio_sample_load("pistol_reload.mp3") }, -- secondary sounds
false, -- strong weapon
false, -- rapid fire
10, -- spread
15, -- damage
1, -- bullet count
0.2, -- bullet scale
500, -- bullet speed
10, -- bullet steps
18, -- max ammo
15, -- deploy time
5, -- cooldown time
60, -- reload time
common_shoot, -- primary fire
common_reload, -- secondary fire
check_common_gun_requirements -- requirement checks function
)
WEAPON_MAGNUM = weapon_register(
"Magnum", -- name
true, -- dual wieldable
E_MODEL_MAGNUM, -- weapon model
E_MODEL_SINGLE_ARM, -- arm model
E_MODEL_METALLIC_BALL, -- bullet model
{ sync_audio_sample_load("magnum_shoot.mp3") }, -- primary sounds
{ sync_audio_sample_load("magnum_reload.mp3") }, -- secondary sounds
false, -- strong weapon
false, -- rapid fire
0, -- spread
50, -- damage
1, -- bullet count
0.2, -- bullet scale
2000, -- bullet speed
40, -- bullet steps
6, -- max ammo
15, -- deploy time
30, -- cooldown time
90, -- reload time
common_shoot, -- primary fire
common_reload, -- secondary fire
check_common_gun_requirements -- requirement checks function
)
WEAPON_AK47 = weapon_register(
"AK47", -- name
false, -- dual wieldable
E_MODEL_AK47, -- weapon model
E_MODEL_SINGLE_ARM, -- arm model
E_MODEL_YELLOW_COIN, -- bullet model
{ sync_audio_sample_load("ak47_shoot.mp3") }, -- primary sounds
{ sync_audio_sample_load("pistol_reload.mp3") }, -- secondary sounds
false, -- strong weapon
true, -- rapid fire
30, -- spread
10, -- damage
1, -- bullet count
0.2, -- bullet scale
500, -- bullet speed
10, -- bullet steps
40, -- max ammo
30, -- deploy time
4, -- cooldown time
70, -- reload time
common_shoot, -- primary fire
common_reload, -- secondary fire
check_common_gun_requirements -- requirement checks function
)
--[[WEAPON_SHOTGUN = weapon_register(
"Shotgun", -- name
false, -- dual wieldable
E_MODEL_SHOTGUN, -- weapon model
E_MODEL_SINGLE_ARM, -- arm model
E_MODEL_RED_COIN, -- bullet model
{ sync_audio_sample_load("shotgun_shoot.mp3") }, -- primary sounds
{}, -- secondary sounds
true, -- strong weapon
false, -- rapid fire
50, -- spread
6, -- damage
5, -- bullet count
0.2, -- bullet scale
1000, -- bullet speed
20, -- bullet steps
7, -- max ammo
15, -- deploy time
30, -- cooldown time
120, -- reload time
common_shoot, -- primary fire
common_reload, -- secondary fire
check_common_gun_requirements -- requirement checks function
)]]

406
mods/gun-mod/main.lua Normal file
View file

@ -0,0 +1,406 @@
-- name: .Gun Mod DX
-- description: Gun Mod DX v3.0\nBy \\#ec7731\\Agent X\\#dcdcdc\\\nSpecial thanks to \\#f296af\\PeachyPeach\\#dcdcdc\\\n\nThis is a rewritten & overhauled version of my original Gun Mod for sm64ex-coop. I thought this would make a good mod to bundle with sm64coopdx.\n\nPress [\\#3040ff\\Y\\#dcdcdc\\] to shoot\nPress [\\#3040ff\\X\\#dcdcdc\\] to reload\nRun \\#00ffff\\/gm help\\#dcdcdc\\ for help
-- deluxe: true
if SM64COOPDX_VERSION == nil then return end
gGlobalSyncTable.gunModEnabled = true
local renderHud = true
gShootableHitboxes = {
[id_bhvMario] = hurt_player,
[id_bhvStar] = hurt_star,
[id_bhvMessagePanel] = hurt_sign,
[id_bhvToadMessage] = hurt_toad,
[id_bhvExclamationBox] = hurt_exclamation_box,
[id_bhvBreakableBox] = hurt_breakable_box,
[id_bhvBreakableBoxSmall] = hurt_breakable_box_small,
[id_bhvBowlingBall] = hurt_bowling_ball,
[id_bhvWaterBomb] = hurt_water_bomb,
[id_bhvTree] = hurt_tree,
[id_bhvChainChomp] = hurt_chain_chomp,
[id_bhvGoomba] = hurt_goomba,
[id_bhvBobomb] = hurt_bobomb,
[id_bhvHomingAmp] = hurt_amp,
[id_bhvCirclingAmp] = hurt_amp,
[id_bhvKoopa] = hurt_koopa,
[id_bhvFlyGuy] = hurt_snufit,
[id_bhvChuckya] = hurt_chuckya,
[id_bhvPiranhaPlant] = hurt_piranha_plant,
[id_bhvSnufit] = hurt_snufit,
[id_bhvSwoop] = hurt_snufit,
[id_bhvSpindrift] = hurt_spindrift,
[id_bhvMrBlizzard] = hurt_mr_blizzard,
[id_bhvMrI] = hurt_mr_i,
[id_bhvScuttlebug] = hurt_scuttlebug,
[id_bhvPokeyBodyPart] = hurt_pokey,
[id_bhvSkeeter] = hurt_scuttlebug,
[id_bhvSmallBully] = hurt_bully,
[id_bhvBigBully] = hurt_bully,
[id_bhvSmallChillBully] = hurt_bully,
[id_bhvBigChillBully] = hurt_bully,
[id_bhvKingBobomb] = hurt_king_bobomb,
[id_bhvBowser] = hurt_bowser,
[id_bhvYoshi] = hurt_yoshi
}
--- @param enable boolean
--- @return nil
--- Globally enables or disables Gun Mod
local function enable_gun_mod(enable)
if not network_is_server() and not network_is_moderator() then return end
if type(enable) ~= "boolean" then return end
gGlobalSyncTable.gunModEnabled = enable
djui_popup_create("Gun Mod has been " .. if_then_else(gGlobalSyncTable.gunModEnabled, "enabled.", "disabled."), 2)
end
--- @param weapon WeaponId
--- Returns a weapon by its ID
local function get_weapon(weapon)
return gWeaponTable[weapon]
end
--- @return nil
--- Returns whether or not the Gun Mod HUD will render
local function get_render_hud()
return renderHud
end
--- @param enable boolean
--- @return nil
--- Sets whether or not the Gun Mod HUD will render
local function set_render_hud(enable)
if type(enable) ~= "boolean" then return end
renderHud = enable
end
--- @param behavior BehaviorId
--- @param hurtFunc fun(obj:Object, bulletObj:Object)
--- @return nil
local function shootable_register(behavior, hurtFunc)
if type(behavior) ~= "number" or type(hurtFunc) ~= "function" then return end
gShootableHitboxes[behavior] = hurtFunc
end
--- @param m MarioState
local function mario_update(m)
if active_player(m) == 0 then return end
if gGlobalSyncTable.gunModEnabled and gPlayerSyncTable[m.playerIndex].curWeapon ~= nil then
local spawned = false
local held = obj_get_first_with_behavior_id(id_bhvHeldWeapon)
while held ~= nil do
if obj_get_weapon_owner(held) == gNetworkPlayers[m.playerIndex].globalIndex then
spawned = true
break
end
held = obj_get_next_with_same_behavior_id(held)
end
if not spawned then
spawn_non_sync_object(
id_bhvHeldWeapon,
gWeaponTable[gPlayerSyncTable[m.playerIndex].curWeapon].model,
0, 0, 0,
--- @param o Object
function(o)
obj_set_weapon_params(o, gNetworkPlayers[m.playerIndex].globalIndex, gPlayerSyncTable[m.playerIndex].curWeapon, 0, 0)
end
)
if gPlayerSyncTable[m.playerIndex].curWeapon2 ~= nil then
spawn_non_sync_object(
id_bhvHeldWeapon,
gWeaponTable[gPlayerSyncTable[m.playerIndex].curWeapon2].model,
0, 0, 0,
--- @param o Object
function(o)
obj_set_weapon_params(o, gNetworkPlayers[m.playerIndex].globalIndex, gPlayerSyncTable[m.playerIndex].curWeapon2, 1, 0)
end
)
end
end
end
if m.playerIndex ~= 0 then return end
if vec3f_dist(m.pos, m.area.camera.pos) < 500 and (m.action & ACT_GROUP_MASK) ~= ACT_GROUP_CUTSCENE then
m.marioBodyState.modelState = m.marioBodyState.modelState | MODEL_STATE_NOISE_ALPHA
end
if get_first_person_enabled() then
if gGlobalSyncTable.gunModEnabled and obj_get_first_with_behavior_id(id_bhvViewmodel) == nil and cur_weapon() ~= nil then
spawn_viewmodels()
end
if (m.action & ACT_FLAG_IDLE) ~= 0 then
m.faceAngle.y = gLakituState.yaw + 0x8000
end
-- movement
-- if m.action ~= ACT_CUSTOM_MOVEMENT then
-- set_mario_action(m, ACT_CUSTOM_MOVEMENT, 0)
-- vec3f_copy(gPlayerFirstPerson.movement.pos, m.pos)
-- end
elseif not camera_config_is_mouse_look_enabled() then
djui_hud_set_mouse_locked(false)
end
-- disable negative vertical speed conservation so guns don't appear lower than normal
local group = (m.action & ACT_GROUP_MASK)
if (group == ACT_GROUP_MOVING or group == ACT_GROUP_STATIONARY or group == ACT_GROUP_OBJECT) and (m.action & ACT_FLAG_AIR) == 0 and m.vel.y < 0 then
m.vel.y = 0
end
if gGlobalSyncTable.gunModEnabled then
weapon_update()
end
end
local function on_level_init()
local obj = obj_get_first(OBJ_LIST_SURFACE)
while obj ~= nil do
obj.header.gfx.skipInViewCheck = true
obj = obj_get_next(obj)
end
spawn_dialog_arrow()
if not mod_storage_load_bool("init") then
mod_storage_save_bool("init", true)
audio_sample_play(SOUND_CUSTOM_BAD_TO_THE_BONE, gMarioStates[0].pos, 1)
end
end
local function on_hud_render_behind()
local weapon = cur_weapon()
if weapon == nil or not renderHud or not gGlobalSyncTable.gunModEnabled or gNetworkPlayers[0].currActNum == 99 or obj_get_first_with_behavior_id(id_bhvActSelector) ~= nil then return end
djui_hud_set_resolution(RESOLUTION_N64)
djui_hud_set_font(FONT_HUD)
local width = djui_hud_get_screen_width()
local height = djui_hud_get_screen_height()
if get_first_person_enabled() and weapon ~= nil and not is_game_paused() then
djui_hud_set_color(255, 255, 0, 127)
djui_hud_render_texture(TEX_CROSSHAIR, width * 0.5 - 4, height * 0.5 - 4, 0.5, 0.5)
end
local y = height - 35
djui_hud_set_color(255, 255, 255, 255)
if weapon.maxAmmo ~= 0 then
djui_hud_print_text(weapon.ammo .. "/" .. weapon.maxAmmo, width - 128, y, 1)
end
local weapon2 = cur_dual_wield_weapon()
if weapon2 ~= nil and weapon2.maxAmmo ~= 0 then
djui_hud_print_text(weapon2.ammo .. "/" .. weapon2.maxAmmo, 16, y, 1)
end
end
function on_packet_receive(dataTable)
if dataTable.packet == PACKET_ATTACK then
if gNetworkPlayers[0].currLevelNum == dataTable.level and gNetworkPlayers[0].currAreaIndex == dataTable.area and gNetworkPlayers[0].currActNum == dataTable.act then
audio_sample_play(SOUND_CUSTOM_IMPACT, gMarioStates[0].pos, 1)
end
if dataTable.yoshi then
local pos = gMarioStates[network_local_index_from_global(dataTable.globalIndex)].pos
spawn_non_sync_object(
id_bhvExplosion,
E_MODEL_TROLL_EXPLOSION,
pos.x, pos.y + 80, pos.z,
nil
)
end
if gNetworkPlayers[0].globalIndex ~= dataTable.globalIndex then return end
if dataTable.yoshi then
set_health(0)
else
set_health(get_health() - gWeaponTable[dataTable.weaponId].damage)
end
elseif dataTable.packet == PACKET_SOUND then
if gNetworkPlayers[0].currLevelNum == dataTable.level and gNetworkPlayers[0].currAreaIndex == dataTable.area and gNetworkPlayers[0].currActNum == dataTable.act then
-- audio_sample_stop(gSoundTable[dataTable.sound])
audio_sample_play(gSoundTable[dataTable.sound], { x = dataTable.x, y = dataTable.y, z = dataTable.z }, dataTable.volume)
end
end
end
--------------
-- commands --
--------------
local function on_fp_command()
set_first_person_enabled(not gFirstPersonCamera.enabled)
djui_chat_message_create("[Gun Mod] First person mode status: " .. on_or_off(gFirstPersonCamera.enabled))
return true
end
local function on_fov_command(msg)
local fov = tonumber(msg)
if fov ~= nil then
if fov <= 0 then
fov = FIRST_PERSON_DEFAULT_FOV
end
mod_storage_save_number("fov", fov)
gFirstPersonCamera.fov = fov
djui_chat_message_create("[Gun Mod] Set FOV to " .. fov)
return true
end
djui_chat_message_create("/gm \\#00ffff\\fov\\#ffff00\\ [number]\\#ffffff\\\nSets the first person camera FOV, default is \\#ffff00\\70\\#ffffff\\")
return true
end
local function on_give_command(msg)
-- if not network_is_server() and not network_is_moderator() then
-- djui_chat_message_create("\\#ffa0a0\\You do not have permission to run this command.")
-- return true
-- end
if not gGlobalSyncTable.gunModEnabled then
djui_chat_message_create("\\#ffa0a0\\[Gun Mod] You need to enable Gun Mod to give yourself a weapon.")
return true
end
for id, weapon in pairs(gWeaponTable) do
if weapon.name:lower() == msg:lower() then
pickup_weapon(id)
local text = string.format("[Gun Mod] Gave %s %s", name_without_hex(gNetworkPlayers[0].name), weapon.name)
djui_chat_message_create(text)
return true
end
end
djui_chat_message_create("/gm \\#00ffff\\give\\#ffff00\\ " .. get_weapon_list_string() .. "\\#ffffff\\\nGives yourself a gun")
return true
end
local function on_gm_command(msg)
local args = split(msg)
if args[1] == "fp" then
return on_fp_command()
elseif args[1] == "fov" then
return on_fov_command(args[2] or "")
elseif args[1] == "give" then
return on_give_command(args[2] or "")
end
if msg:gsub("%s+", "") == "" then
gGlobalSyncTable.gunModEnabled = not gGlobalSyncTable.gunModEnabled
djui_chat_message_create("[Gun Mod] Status: " .. on_or_off(gGlobalSyncTable.gunModEnabled))
else
djui_chat_message_create("/gm \\#00ffff\\[fp|fov|give]\\#7f7f7f\\ (leave blank to toggle Gun Mod on or off)")
end
return true
end
smlua_text_utils_dialog_replace(DIALOG_167, 1, 4, 30, 200, "Welcome to Gun Mod. After\
4 months in development,\
hopefully it will have\
been worth the wait.\
This mod has actually been\
in development for 16\
months, but progress was\
pretty slow until recently.\
I decided to rewrite the\
rewrite to make this\
mod's code less of a\
total mess.\
-- TUTORIAL --\
Press X to shoot\
Press Y to reload\
Run slash gm help\
Princess Toadstool's\
castle is just ahead.\
\
\
Press [A] to jump, [Z] to\
crouch, and [B] to punch,\
read a sign, or grab\
something.\
Press [B] again to throw\
something you're holding.")
gServerSettings.playerInteractions = PLAYER_INTERACTIONS_PVP
_G.gunModApi = {
enable_gun_mod = enable_gun_mod,
get_render_hud = get_render_hud,
set_render_hud = set_render_hud,
get_weapon = get_weapon,
weapon_register = weapon_register,
weapon_unregister = weapon_unregister,
weapon_unregister_all = weapon_unregister_all,
get_weapon_list_string = get_weapon_list_string,
obj_set_weapon_params = obj_set_weapon_params,
obj_get_weapon_owner = obj_get_weapon_owner,
obj_get_weapon_id = obj_get_weapon_id,
obj_get_weapon_dual_wield = obj_get_weapon_dual_wield,
obj_get_weapon_extra = obj_get_weapon_extra,
cur_weapon = cur_weapon,
cur_dual_wield_weapon = cur_dual_wield_weapon,
get_inventory_slot = get_inventory_slot,
set_inventory_slot = set_inventory_slot,
pickup_weapon = pickup_weapon,
get_health = get_health,
set_health = set_health,
common_shoot = common_shoot,
common_reload = common_reload,
bullet_ricochet = bullet_ricochet,
obj_generate_hitbox_multiply_func = obj_generate_hitbox_multiply_func,
obj_generate_health_func = obj_generate_health_func,
shootable_register = shootable_register,
gm_hook_behavior = gm_hook_behavior
}
local fov = mod_storage_load_number("fov")
if fov == 0 then
fov = FIRST_PERSON_DEFAULT_FOV
mod_storage_save_number("fov", fov)
end
gFirstPersonCamera.fov = fov
if START_IN_FIRST_PERSON then
set_first_person_enabled(true)
end
hook_event(HOOK_MARIO_UPDATE, mario_update)
hook_event(HOOK_ON_LEVEL_INIT, on_level_init)
hook_event(HOOK_ON_PACKET_RECEIVE, on_packet_receive)
hook_event(HOOK_ON_HUD_RENDER_BEHIND, on_hud_render_behind)
gm_hook_behavior(id_bhvMessagePanel, false, obj_sign_hitbox)
gm_hook_behavior(id_bhvExclamationBox, false, nil, obj_generate_hitbox_multiply_func(1, 1.8))
gm_hook_behavior(id_bhvBreakableBox, false, obj_generate_health_func(HEALTH_BREAKABLE_BOX))
gm_hook_behavior(id_bhvBowlingBall, false, obj_generate_health_func(HEALTH_BOWLING_BALL))
gm_hook_behavior(id_bhvWaterBomb, false, nil, obj_generate_hitbox_multiply_func(1, 2))
gm_hook_behavior(id_bhvChainChomp, false, nil, obj_generate_hitbox_multiply_func(1.5, 1.5))
gm_hook_behavior(id_bhvHomingAmp, false, nil, obj_amp_hitbox)
gm_hook_behavior(id_bhvCirclingAmp, false, nil, obj_amp_hitbox)
gm_hook_behavior(id_bhvFlyGuy, false, nil, obj_generate_hitbox_multiply_func(0.75, 1.75))
gm_hook_behavior(id_bhvChuckya, false, obj_chuckya_hitbox)
gm_hook_behavior(id_bhvSnufit, false, nil, obj_snufit_hitbox)
gm_hook_behavior(id_bhvSpindrift, false, nil, obj_generate_hitbox_multiply_func(0.75, 2))
gm_hook_behavior(id_bhvKingBobomb, false, obj_king_bobomb_hitbox)
gm_hook_behavior(id_bhvBowser, false, obj_generate_health_func(HEALTH_BOWSER))
gm_hook_behavior(id_bhvStaticObject, false, obj_skip_in_view_check)
hook_chat_command("gm", "\\#00ffff\\[fp|fov|give]\\#7f7f7f\\ (leave blank to toggle Gun Mod on or off)", on_gm_command)
-- matches the function(s) below
for i = 0, MAX_PLAYERS - 1 do
gPlayerSyncTable[i].curWeapon = WEAPON_MAGNUM
gPlayerSyncTable[i].curWeapon2 = WEAPON_PISTOL
end
pickup_weapon(WEAPON_MAGNUM)
pickup_weapon(WEAPON_PISTOL)

Binary file not shown.

Binary file not shown.

BIN
mods/gun-mod/sound/dry.mp3 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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