diff --git a/dungeon_map/data/entrance_tiles.asm b/dungeon_map/data/entrance_tiles.asm new file mode 100644 index 0000000..f7f01ed --- /dev/null +++ b/dungeon_map/data/entrance_tiles.asm @@ -0,0 +1,26 @@ +dw $200C +dw $100E +dw $2012 +dw $1023 +dw $1024 +dw $2028 +dw $204A +dw $4056 +dw $4057 +dw $4058 +dw $4059 +dw $1060 +dw $2061 +dw $4062 +dw $4063 +dw $2077 +dw $4083 +dw $2084 +dw $1085 +dw $4098 +dw $20C9 +dw $40D5 +dw $10D6 +dw $20DB +dw $40E0 +dw $FFFF diff --git a/dungeon_map/data/supertile_shapes.asm b/dungeon_map/data/supertile_shapes.asm index f0b226c..117b843 100644 --- a/dungeon_map/data/supertile_shapes.asm +++ b/dungeon_map/data/supertile_shapes.asm @@ -5,47 +5,47 @@ db $FF, $FF, $4F, $FF ; 03 - Houlihan db $65, $74, $2D, $2E ; 04 db $FF, $FF, $FF, $FF ; 05 - unused db $FF, $FF, $4F, $FF ; 06 - Arrghus -db $00, $40, $00, $00 ; 07 - Moldorm -db $FF, $FF, $72, $5F ; 08 - useless fairy entrance +db $00, $30, $00, $00 ; 07 - Moldorm +db $FF, $FF, $72, $72 ; 08 - useless fairy entrance db $66, $3B, $FF, $FF ; 09 db $58, $1F, $FF, $FF ; 0A db $2E, $67, $2E, $1E ; 0B -db $31, $31, $24, $24 ; 0C +db $31, $31, $14, $14 ; 0C db $FF, $FF, $4F, $FF ; 0D - Aga 2 -db $FF, $FF, $57, $5F ; 0E +db $FF, $FF, $57, $72 ; 0E db $FF, $FF, $FF, $FF ; 0F - unused and should never be used, treated as non-id -db $00, $00, $20, $00 ; 10 -db $00, $30, $00, $10 -db $14, $14, $24, $24 +db $00, $00, $10, $00 ; 10 +db $00, $30, $00, $10 ; 11 +db $14, $14, $14, $14 ; 12 db $FF, $77, $FF, $77 ; 13 -db $11, $01, $11, $11 -db $34, $00, $01, $00 +db $11, $01, $11, $11 ; 14 +db $34, $00, $01, $00 ; 15 db $75, $65, $2E, $2E ; 16 -db $40, $40, $00, $00 +db $30, $30, $00, $00 ; 17 db $75, $FF, $74, $FF ; 18 - useless fairy drop -db $FF, $29, $FF, $1A ; 19 +db $FF, $29, $FF, $2A ; 19 db $6E, $6F, $6D, $75 ; 1A db $2E, $67, $75, $FF ; 1B db $74, $74, $3E, $2E ; 1C -db $72, $67, $FF, $FF -db $FF, $68, $57, $4B +db $72, $67, $FF, $FF ; 1D +db $FF, $68, $57, $4B ; 1E db $FF, $FF, $71, $57 ; 1F db $FF, $FF, $4F, $FF ; 20 -db $00, $10, $00, $01 +db $00, $10, $00, $01 ; 21 db $FF, $FF, $28, $08 ; 22 -db $FF, $FF, $FF, $6B -db $10, $10, $01, $20 ; 24 +db $FF, $FF, $FF, $5B ; 23 +db $10, $10, $01, $10 ; 24 db $FF, $FF, $FF, $FF ; 25 - unused db $00, $3C, $14, $42 ; 26 -db $40, $40, $00, $00 -db $65, $FF, $1B, $0B ; 28 +db $30, $30, $00, $00 ; 27 +db $65, $FF, $2D, $08 ; 28 db $FF, $FF, $FF, $56 ; 29 - Mothula db $10, $12, $10, $5E db $2A, $FF, $0D, $70 ; 2B db $00, $00, $10, $10 ; 2C - hookshot cave back db $FF, $FF, $FF, $FF ; 2D - unused db $FF, $4F, $FF, $FF ; 2E -db $74, $FF, $2E, $5F ; 2F - Kakariko well +db $74, $FF, $2E, $72 ; 2F - Kakariko well db $75, $FF, $65, $FF ; 30 db $2E, $57, $2E, $57 ; 31 db $14, $14, $44, $44 @@ -58,7 +58,7 @@ db $6C, $FF, $77, $FF ; 38 db $FF, $FF, $72, $69 ; 39 db $64, $64, $14, $14 db $65, $FF, $75, $FF -db $00, $10, $00, $20 ; 3C - hookshot cave front +db $00, $10, $00, $10 ; 3C - hookshot cave front db $2E, $2E, $75, $65 ; 3D db $FF, $74, $72, $2E ; 3E db $FF, $FF, $57, $57 @@ -72,7 +72,7 @@ db $14, $14, $00, $00 db $FF, $FF, $FF, $FF ; 47 - unused db $FF, $FF, $FF, $FF ; 48 - unused db $72, $2E, $72, $2E ; 49 -db $61, $61, $24, $24 ; 4A +db $61, $61, $14, $14 ; 4A db $75, $0E, $2E, $2E ; 4B db $FF, $65, $FF, $77 ; 4C db $10, $30, $01, $00 @@ -83,24 +83,24 @@ db $14, $14, $44, $44 db $77, $FF, $19, $08 ; 52 db $65, $75, $2E, $2E ; 53 db $50, $50, $40, $00 ; 54 -db $00, $00, $20, $00 ; 55 -db $74, $74, $2B, $3D ; 56 -db $2E, $70, $63, $5B -db $00, $00, $21, $10 ; 58 - split -db $10, $00, $20, $00 +db $00, $00, $10, $00 ; 55 +db $74, $74, $2D, $3D ; 56 +db $2E, $70, $4A, $5B ; 57 +db $00, $00, $11, $10 ; 58 - split +db $10, $00, $10, $00 db $FF, $FF, $FF, $4F ; 5A - Helmasaur King db $FF, $77, $FF, $75 ; 5B db $71, $6A, $FF, $74 ; 5C db $2E, $67, $75, $FF ; 5D db $FF, $68, $57, $4B ; 5E -db $FF, $FF, $7B, $FF -db $FF, $39, $FF, $3A ; 60 -db $47, $45, $26, $26 -db $06, $14, $22, $00 -db $65, $FF, $76, $FF ; 63 -db $FF, $FF, $57, $71 +db $FF, $FF, $7B, $FF ; 5F +db $FF, $39, $FF, $2A ; 60 +db $47, $45, $16, $16 ; 61 +db $06, $14, $12, $00 ; 62 +db $65, $FF, $75, $FF ; 63 +db $FF, $FF, $57, $71 ; 64 db $FF, $FF, $71, $69 ; 65 -db $00, $30, $10, $00 +db $00, $30, $10, $00 ; 66 db $00, $10, $00, $01 ; 67 db $00, $10, $01, $00 ; 68 db $FF, $FF, $FF, $FF ; 69 - unused @@ -129,9 +129,9 @@ db $77, $FF, $55, $FF db $67, $70, $FF, $FF ; 80 db $10, $01, $00, $01 db $5D, $14, $01, $00 ; 82 -db $74, $75, $2B, $2E ; 83 -db $04, $05, $24, $24 -db $4B, $72, $2E, $5F ; 85 +db $74, $75, $2D, $2E ; 83 +db $04, $05, $14, $14 +db $4B, $72, $2E, $72 ; 85 db $FF, $FF, $FF, $FF ; 86 - unused db $67, $2E, $54, $74 db $FF, $FF, $FF, $FF ; 88 - unused @@ -148,28 +148,28 @@ db $00, $00, $01, $01 ; 92 - should it be split? idk db $2C, $2C, $77, $74 ; 93 db $FF, $FF, $FF, $FF ; 94 - unused db $FF, $77, $FF, $75 ; 95 -db $77, $FF, $2E, $57 +db $77, $FF, $2E, $57 ; 96 db $65, $74, $2E, $2F ; 97 -db $FF, $FF, $5F, $57 ; 98 +db $FF, $FF, $72, $57 ; 98 db $FF, $74, $0A, $18 ; 99 db $FF, $FF, $FF, $FF ; 9A - unused db $72, $1E, $1E, $38 ; 9B -db $10, $10, $01, $01 +db $10, $10, $01, $01 ; 9C db $1E, $72, $71, $1E ; 9D db $FF, $65, $70, $79 ; 9E db $FF, $FF, $5B, $FF ; 9F db $72, $57, $FF, $FF ; A0 db $70, $1D, $FF, $2A ; A1 -db $45, $45, $16, $06 +db $45, $45, $16, $06 ; A2 db $1A, $FF, $2A, $FF ; A3 db $FF, $FF, $4E, $FF ; A4 db $65, $75, $2E, $2E ; A5 db $00, $30, $00, $00 ; A6 db $56, $FF, $FF, $FF ; A7 - ToH fairy basement room db $00, $03, $00, $12 ; A8 -db $17, $17, $16, $16 -db $03, $00, $12, $00 -db $FF, $FF, $5A, $FF +db $17, $17, $16, $16 ; A9 +db $03, $00, $12, $00 ; AA +db $FF, $FF, $5A, $FF ; AB db $FF, $FF, $FF, $4F ; AC - Blind db $FF, $FF, $FF, $FF ; AD - unused db $FF, $59, $FF, $FF ; AE @@ -177,29 +177,29 @@ db $5B, $FF, $FF, $FF ; AF db $2E, $67, $2E, $57 ; B0 db $0E, $75, $0C, $2D ; B1 db $1C, $62, $72, $4B ; B2 - split this monster somehow? -db $4A, $FF, $4A, $FF -db $10, $00, $44, $44 -db $30, $00, $10, $00 -db $65, $74, $75, $75 -db $74, $FF, $75, $FF +db $4A, $FF, $4A, $FF ; B3 +db $10, $00, $44, $44 ; B4 +db $30, $00, $10, $00 ; B5 +db $65, $74, $75, $75 ; B6 +db $74, $FF, $75, $FF ; B7 db $FF, $4A, $FF, $74 ; B8 -db $15, $15, $14, $14 -db $73, $70, $FF, $FF -db $10, $01, $00, $01 ; BB -db $34, $10, $11, $10 +db $15, $15, $14, $14 ; B9 +db $73, $70, $FF, $FF ; BA +db $2D, $3D, $2E, $3D ; BB +db $7F, $2D, $73, $2D ; BC - block off entrances? db $FF, $FF, $FF, $FF ; BD - unused -db $FF, $65, $FF, $4A +db $FF, $65, $FF, $4A ; BE db $FF, $FF, $4D, $FF ; BF db $2E, $67, $2E, $57 ; C0 -db $2E, $73, $2D, $73 -db $11, $13, $01, $13 -db $13, $00, $03, $00 +db $2E, $73, $2D, $73 ; C1 +db $11, $13, $01, $13 ; C2 +db $13, $00, $03, $00 ; C3 db $44, $44, $00, $01 ; C4 -db $75, $FF, $4A, $FF -db $10, $11, $10, $11 -db $11, $00, $01, $00 +db $75, $FF, $4A, $FF ; C5 +db $10, $11, $10, $11 ; C6 +db $11, $00, $01, $00 ; C7 db $FF, $FF, $FF, $4F ; C8 - Armos Knights -db $14, $14, $24, $24 ; C9 +db $14, $14, $14, $14 ; C9 db $FF, $FF, $FF, $FF ; CA - unused db $00, $03, $14, $07 ; CB db $13, $10, $07, $14 ; CC @@ -211,48 +211,48 @@ db $4E, $4F, $1E, $70 ; D1 db $FF, $75, $FF, $55 db $FF, $FF, $FF, $FF ; D3 - unused db $FF, $FF, $FF, $FF ; D4 - unused -db $75, $FF, $76, $FF -db $75, $75, $74, $76 +db $75, $FF, $75, $FF ; D5 +db $75, $75, $74, $75 ; D6 db $FF, $FF, $FF, $FF ; D7 - unused db $FF, $75, $FF, $77 ; D8 -db $FF, $FF, $71, $71 -db $FF, $FF, $5C, $FF -db $14, $06, $24, $3F +db $FF, $FF, $71, $71 ; D9 +db $FF, $FF, $5C, $FF ; DA +db $14, $06, $14, $3F ; DB db $06, $14, $03, $00 ; DC db $FF, $FF, $FF, $FF ; DD - unused db $FF, $56, $FF, $FF ; DE - Kholdstare -db $FF, $FF, $60, $24 ; DF - paradox top -db $2E, $67, $76, $FF ; E0 +db $FF, $FF, $60, $14 ; DF - paradox top +db $2E, $67, $75, $FF ; E0 ; no more dungeon -db $00, $00, $20, $00 ; E1 - lost woods thieves hideout -db $00, $00, $00, $20 ; E2 - lumberjack cave -db $FF, $74, $5F, $2E ; E3 - magic bat -db $00, $02, $20, $02 ; E4 - old man's house front -db $02, $00, $26, $24 ; E5 - old man's house back +db $00, $00, $10, $00 ; E1 - lost woods thieves hideout +db $00, $00, $00, $10 ; E2 - lumberjack cave +db $FF, $74, $72, $2E ; E3 - magic bat +db $00, $02, $10, $02 ; E4 - old man's house front +db $02, $00, $16, $14 ; E5 - old man's house back db $00, $01, $10, $00 ; E6 - death mountain descent left -db $01, $00, $00, $20 ; E7 - death mountain descent right -db $30, $30, $40, $20 ; E8 - superbunny top +db $01, $00, $00, $10 ; E7 - death mountain descent right +db $30, $30, $40, $10 ; E8 - superbunny top db $FF, $FF, $FF, $FF ; E9 - unused -db $65, $FF, $76, $FF ; EA - spectacle top -db $FF, $66, $FF, $76 ; EB - bumper top +db $65, $FF, $75, $FF ; EA - spectacle top +db $FF, $66, $FF, $75 ; EB - bumper top db $FF, $FF, $FF, $FF ; EC - unused -db $30, $30, $00, $20 ; ED - fairy ascension top -db $00, $50, $00, $20 ; EE - spiral top -db $FF, $00, $60, $24 ; EF - paradox top -db $00, $02, $20, $02 ; F0 - old man rescue left -db $02, $02, $00, $20 ; F1 - old man rescue right -db $FF, $FF, $FF, $5F ; F2 - Sahasrahla's Kakariko house left -db $FF, $FF, $5F, $FF ; F3 - Sahasrahla's Kakariko house right -db $FF, $FF, $FF, $5F ; F4 - quarreling brothers left -db $FF, $FF, $5F, $FF ; F5 - quarreling brothers right +db $30, $30, $00, $10 ; ED - fairy ascension top +db $00, $50, $00, $10 ; EE - spiral top +db $FF, $00, $60, $14 ; EF - paradox top +db $00, $02, $10, $02 ; F0 - old man rescue left +db $02, $02, $00, $10 ; F1 - old man rescue right +db $FF, $FF, $FF, $72 ; F2 - Sahasrahla's Kakariko house left +db $FF, $FF, $72, $FF ; F3 - Sahasrahla's Kakariko house right +db $FF, $FF, $FF, $72 ; F4 - quarreling brothers left +db $FF, $FF, $72, $FF ; F5 - quarreling brothers right db $FF, $FF, $FF, $FF ; F6 - unused db $FF, $FF, $FF, $FF ; F7 - unused -db $30, $30, $60, $24 ; F8 - superbunny bottom -db $00, $01, $20, $00 ; F9 - spectacle left -db $34, $00, $20, $00 ; FA - spectacle bottom +db $30, $30, $60, $14 ; F8 - superbunny bottom +db $00, $01, $10, $00 ; F9 - spectacle left +db $34, $00, $10, $00 ; FA - spectacle bottom db $FF, $65, $08, $18 ; FB - bumper bottom db $FF, $FF, $FF, $FF ; FC - unused -db $30, $30, $24, $24 ; FD - fairy ascension bottom -db $FF, $FF, $74, $76 ; FE - spiral bottom -db $74, $74, $2E, $2B ; FF - paradox bottom +db $30, $30, $14, $14 ; FD - fairy ascension bottom +db $FF, $FF, $74, $75 ; FE - spiral bottom +db $74, $74, $2E, $2D ; FF - paradox bottom diff --git a/dungeon_map/draw_loot.asm b/dungeon_map/draw_loot.asm index 2d5393d..17975eb 100644 --- a/dungeon_map/draw_loot.asm +++ b/dungeon_map/draw_loot.asm @@ -21,11 +21,11 @@ DrawLoot: STZ.b $0E LDX.w DungeonID - LDA.l $8AF615, X + LDA.l DungeonMapRoomPointers, X STA.b $0C SEP #$20 - LDA.l $8AF5E9, X + LDA.l DungeonMapFloorCountData, X AND.b #$0F CLC : ADC.w $020E PHA @@ -55,7 +55,7 @@ DrawSingleFloorLoot: ASL A TAX - LDA.l $8AF605, X + LDA.l DungeonMapFloorToDataOffset, X TAY STZ.b $06 diff --git a/dungeon_map/draw_rooms.asm b/dungeon_map/draw_rooms.asm index 4c05d17..0be9c57 100644 --- a/dungeon_map/draw_rooms.asm +++ b/dungeon_map/draw_rooms.asm @@ -111,3 +111,136 @@ DrawDungeonMapRoom: PLA : STA.b $0A PLB RTL + +DrawEntrances: + REP #$30 + PHX : PHY + LDA.b $06 : PHA + + LDX.w DungeonID + LDA.l DungeonMapRoomPointers, X + STA.b $0C + + SEP #$20 + LDA.l DungeonMapFloorCountData, X + AND.b #$0F + CLC : ADC.w $020E + DEC A + REP #$20 + AND.w #$00FF + + JSR DrawBothFloorsEntrances + +.done + REP #$20 + PLA : STA.b $06 + PLY : PLX + SEP #$30 + RTL + +DrawBothFloorsEntrances: + ASL A + TAX + + LDA.l DungeonMapFloorToDataOffset, X + TAY + STZ.b $06 + +.next_room + REP #$20 + LDA.b ($0C), Y ; get room id + AND.w #$00FF + CMP.w #$000F ; $0F = empty room + + BEQ + + JSR DrawSingleRoomEntrances ++ + + INY + + SEP #$20 + INC.b $06 + LDA.b $06 + CMP.b #$05 + BCC .next_room + + STZ.b $06 +- INC.b $07 + LDA.b $07 + CMP.b #$0A + BCC .next_room + +.done + RTS + +macro DrawSingleEntrance(offset) + LDX.b $00 + STZ.w OAMBufferAux, X ; high x-bit and size bit + TXA + ASL #2 + TAX + + LDA.b $06 + ASL #4 + CLC : ADC.b #$90+ + STA.w OAMBuffer+0, X + + LDA.b $07 + ASL #4 + CMP.b #$50 + BCC ?+ + CLC : ADC.b #$50 +?+ CLC : ADC.b #$87 + CLC : ADC.w $0213 + SEC : SBC.b $E8 + STA.w OAMBuffer+1, X + + LDA.b #$33 + STA.w OAMBuffer+2, X + + LDA.b #$23 + STA.w OAMBuffer+3, X + + INC.b $00 +endmacro + +DrawSingleRoomEntrances: + STA.b $0E + SEP #$10 + + LDX.b #$FE +.next_entry + INX : INX + LDA.l SupertileEntrances, X + BPL + + JMP .done ++ + + AND.w #$0FFF + CMP.b $0E + BNE .next_entry + + SEP #$20 + LDA.l SupertileEntrances+1, X + PHA : PHA + + BIT.b #$40 + BEQ + + %DrawSingleEntrance(0) ++ + + PLA + BIT.b #$20 + BEQ + + %DrawSingleEntrance(4) ++ + + PLA + BIT.b #$10 + BEQ + + %DrawSingleEntrance(8) ++ + +.done + REP #$30 + RTS diff --git a/dungeon_map/dungeon_switch.asm b/dungeon_map/dungeon_switch.asm index 52a222d..881db9a 100644 --- a/dungeon_map/dungeon_switch.asm +++ b/dungeon_map/dungeon_switch.asm @@ -44,6 +44,7 @@ DungeonMapSwitch_Submodule: LDA.b #$01 STA.w $0200 STA.w $020D + STZ.w $0213 STZ.w $021B STZ.w $021C STZ.b $06 @@ -60,7 +61,15 @@ DungeonMapSwitch_Submodule: SkipMapSprites: STZ.b $00 + + LDA.w $0200 + CMP.b #$04 + BEQ + + JSL DrawEntrances ++ + STZ.b $0E + STZ.b $0F LDA.w $0200 CMP.b #$04 @@ -92,10 +101,12 @@ RestoreCurrentDungeon: RTL RestoreDungeonMapFloorIndex: - STZ.w $020F + STZ.w $020F ; first part we wrote over + LDA.w $021B STA.b $07 STZ.b $06 - LDA.b $0A + + LDA.b $0A ; the rest of what we wrote over AND.b #$08 RTL diff --git a/dungeon_map/hooks.asm b/dungeon_map/hooks.asm index 1b53049..f114bcf 100644 --- a/dungeon_map/hooks.asm +++ b/dungeon_map/hooks.asm @@ -41,6 +41,10 @@ org $8AE64F org $8AE152 JSL LoadLastHUDPalette +org $8AEAE8 ; vanilla checks number of sprites drawn instead of... counting... + LDA.b $0E + CMP.b #$02 + ;================================================================================ ; Swapping Dungeon in Dungeon Map Screen (L/R) ;-------------------------------------------------------------------------------- diff --git a/dungeon_map/settings.asm b/dungeon_map/settings.asm index 40bae62..2df5ca9 100644 --- a/dungeon_map/settings.asm +++ b/dungeon_map/settings.asm @@ -2,6 +2,8 @@ SupertileRoomShapes: incsrc data/supertile_shapes.asm warnpc $B9F400 +padbyte $FF +pad $B9F400 org $B9F400 DungeonMapData: @@ -99,6 +101,14 @@ dw $00A4 : db $0C ; Trinexx dw $FFFF ; $B9F6C0 +SupertileEntrances: +incsrc data/entrance_tiles.asm +warnpc $B9F700 +padbyte $FF +pad $B9F700 + +; $B9F700 + warnpc $B9FF00 diff --git a/menu/map_icons.3bpp b/menu/map_icons.3bpp index 4f56f3f..ab68c7f 100644 Binary files a/menu/map_icons.3bpp and b/menu/map_icons.3bpp differ diff --git a/menu/map_icons_1.3bppc b/menu/map_icons_1.3bppc index c44c5da..307282b 100644 Binary files a/menu/map_icons_1.3bppc and b/menu/map_icons_1.3bppc differ diff --git a/menu/map_icons_2.3bppc b/menu/map_icons_2.3bppc index d72be7e..a20db9e 100644 Binary files a/menu/map_icons_2.3bppc and b/menu/map_icons_2.3bppc differ diff --git a/menu/map_sheet_d4.3bpp b/menu/map_sheet_d4.3bpp index b1de6dd..23bf78b 100644 Binary files a/menu/map_sheet_d4.3bpp and b/menu/map_sheet_d4.3bpp differ diff --git a/menu/map_sheet_d4.3bppc b/menu/map_sheet_d4.3bppc index 738fc9a..65aee39 100644 Binary files a/menu/map_sheet_d4.3bppc and b/menu/map_sheet_d4.3bppc differ diff --git a/ram.asm b/ram.asm index cc98bdc..626f2d5 100644 --- a/ram.asm +++ b/ram.asm @@ -347,6 +347,7 @@ DynamicDropGFXSlots = $7E07F1 ; Assume future use of this up to $0E bytes, t ; which item gfx is currently occupying each slot OAMBuffer = $7E0800 ; Main OAM buffer sent to OAM. $200 bytes. OAMBuffer2 = $7E0A00 ; +OAMBufferAux = $7E0A20 ; high X-bit and size bit sent to OAM, one byte per sprite ; TransparencyFlag = $7E0ABD ; Flags transparency effects e.g. in Thieves Town Hellway ; diff --git a/vanillalabels.asm b/vanillalabels.asm index a26cdf4..fbc64b2 100644 --- a/vanillalabels.asm +++ b/vanillalabels.asm @@ -290,6 +290,9 @@ WorldMap_HandleSpriteBlink = $8AC52E WorldMapIcon_AdjustCoordinate = $8AC59B WorldMap_DarkWorldTilemap = $8AD739 DungeonMapBossRooms = $8AE817 +DungeonMapFloorCountData = $8AF5E9 +DungeonMapFloorToDataOffset = $8AF605 +DungeonMapRoomPointers = $8AF615 DamageSubclassValue = $8DB8F1 TextCharMasks = $8EB844 Credits_ScrollScene_target_y = $8EC308