mirror of
https://gitlab.com/drummyfish/anarch.git
synced 2025-02-16 07:00:11 -05:00
Start drawing enemies
This commit is contained in:
parent
ed42104621
commit
9b85928c71
2
assets.h
2
assets.h
@ -735,7 +735,7 @@ Also: add flip option to sprite drawing function so that some frames can be
|
|||||||
reused flipped (good for walk anims). */
|
reused flipped (good for walk anims). */
|
||||||
|
|
||||||
SFG_PROGRAM_MEMORY uint8_t
|
SFG_PROGRAM_MEMORY uint8_t
|
||||||
SFG_enemySprites[][SFG_TEXTURE_SIZE * SFG_TEXTURE_SIZE] =
|
SFG_monsterSprites[][SFG_TEXTURE_SIZE * SFG_TEXTURE_SIZE] =
|
||||||
{
|
{
|
||||||
{ // 0, idle
|
{ // 0, idle
|
||||||
175,175,175,0,0,0,0,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
|
175,175,175,0,0,0,0,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
|
||||||
|
3
levels.h
3
levels.h
@ -88,6 +88,7 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
#define SFG_LEVEL_ELEMENT_NONE 0
|
#define SFG_LEVEL_ELEMENT_NONE 0
|
||||||
#define SFG_LEVEL_ELEMENT_BARREL 1
|
#define SFG_LEVEL_ELEMENT_BARREL 1
|
||||||
|
#define SFG_LEVEL_ELEMENT_MONSTER1 2
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -236,7 +237,7 @@ SFG_PROGRAM_MEMORY SFG_Level SFG_level0 =
|
|||||||
{SFG_LEVEL_ELEMENT_BARREL, {12, 4}}, {SFG_LEVEL_ELEMENT_BARREL, {15, 4}},
|
{SFG_LEVEL_ELEMENT_BARREL, {12, 4}}, {SFG_LEVEL_ELEMENT_BARREL, {15, 4}},
|
||||||
{SFG_LEVEL_ELEMENT_BARREL, {24, 10}}, {SFG_LEVEL_ELEMENT_NONE, {0, 0}},
|
{SFG_LEVEL_ELEMENT_BARREL, {24, 10}}, {SFG_LEVEL_ELEMENT_NONE, {0, 0}},
|
||||||
{SFG_LEVEL_ELEMENT_BARREL, {13, 4}}, {SFG_LEVEL_ELEMENT_BARREL, {12, 6}},
|
{SFG_LEVEL_ELEMENT_BARREL, {13, 4}}, {SFG_LEVEL_ELEMENT_BARREL, {12, 6}},
|
||||||
{SFG_LEVEL_ELEMENT_NONE, {13, 6}}, {SFG_LEVEL_ELEMENT_BARREL, {12,66}},
|
{SFG_LEVEL_ELEMENT_MONSTER1, {15, 7}}, {SFG_LEVEL_ELEMENT_MONSTER1, {16,8}},
|
||||||
{SFG_LEVEL_ELEMENT_NONE, {0, 0}}, {SFG_LEVEL_ELEMENT_NONE, {0, 0}},
|
{SFG_LEVEL_ELEMENT_NONE, {0, 0}}, {SFG_LEVEL_ELEMENT_NONE, {0, 0}},
|
||||||
{SFG_LEVEL_ELEMENT_NONE, {0, 0}}, {SFG_LEVEL_ELEMENT_NONE, {0, 0}},
|
{SFG_LEVEL_ELEMENT_NONE, {0, 0}}, {SFG_LEVEL_ELEMENT_NONE, {0, 0}},
|
||||||
{SFG_LEVEL_ELEMENT_NONE, {0, 0}}, {SFG_LEVEL_ELEMENT_NONE, {0, 0}},
|
{SFG_LEVEL_ELEMENT_NONE, {0, 0}}, {SFG_LEVEL_ELEMENT_NONE, {0, 0}},
|
||||||
|
124
main.c
124
main.c
@ -224,7 +224,7 @@ void SFG_init();
|
|||||||
|
|
||||||
#define SFG_ITEM_RECORD_ACTIVE_MASK 0x80
|
#define SFG_ITEM_RECORD_ACTIVE_MASK 0x80
|
||||||
|
|
||||||
#define SFG_MAX_LEVEL_ITEMS SFG_MAX_LEVEL_ELEMENTS
|
#define SFG_MAX_ITEMS SFG_MAX_LEVEL_ELEMENTS
|
||||||
|
|
||||||
#define SFG_MAX_SPRITE_SIZE SFG_GAME_RESOLUTION_X
|
#define SFG_MAX_SPRITE_SIZE SFG_GAME_RESOLUTION_X
|
||||||
|
|
||||||
@ -259,6 +259,30 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
typedef uint8_t SFG_ItemRecord;
|
typedef uint8_t SFG_ItemRecord;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t stateType; /**< Holds state (lower 4 bits) and type of monster
|
||||||
|
(upper 4 bits). */
|
||||||
|
uint8_t coords[2];
|
||||||
|
uint8_t health;
|
||||||
|
} SFG_MonsterRecord;
|
||||||
|
|
||||||
|
#define SFG_MONSTER_STATE_INACTIVE 0 ///< Not nearby, not actively updated.
|
||||||
|
#define SFG_MONSTER_STATE_IDLE 1
|
||||||
|
#define SFG_MONSTER_STATE_ATTACKING 2
|
||||||
|
#define SFG_MONSTER_STATE_HURTING 3
|
||||||
|
#define SFG_MONSTER_STATE_DYING 4
|
||||||
|
#define SFG_MONSTER_STATE_GOING_N 5
|
||||||
|
#define SFG_MONSTER_STATE_GOING_NE 6
|
||||||
|
#define SFG_MONSTER_STATE_GOING_SW 7
|
||||||
|
#define SFG_MONSTER_STATE_GOING_S 8
|
||||||
|
#define SFG_MONSTER_STATE_GOING_SW 9
|
||||||
|
#define SFG_MONSTER_STATE_GOING_W 10
|
||||||
|
#define SFG_MONSTER_STATE_GOING_NW 11
|
||||||
|
#define SFG_MONSTER_STATE_GOING_N 12
|
||||||
|
|
||||||
|
#define SFG_MAX_MONSTERS 64
|
||||||
|
|
||||||
/*
|
/*
|
||||||
GLOBAL VARIABLES
|
GLOBAL VARIABLES
|
||||||
===============================================================================
|
===============================================================================
|
||||||
@ -290,7 +314,9 @@ uint8_t SFG_zBuffer[SFG_Z_BUFFER_SIZE];
|
|||||||
int8_t SFG_backgroundScaleMap[SFG_GAME_RESOLUTION_Y];
|
int8_t SFG_backgroundScaleMap[SFG_GAME_RESOLUTION_Y];
|
||||||
uint16_t SFG_backgroundScroll;
|
uint16_t SFG_backgroundScroll;
|
||||||
|
|
||||||
|
/** Helper for precomputing sprite sampling positions for drawing. */
|
||||||
uint8_t SFG_spriteSamplingPoints[SFG_MAX_SPRITE_SIZE];
|
uint8_t SFG_spriteSamplingPoints[SFG_MAX_SPRITE_SIZE];
|
||||||
|
|
||||||
uint32_t SFG_frameTime; ///< Keeps a constant time (in ms) during a frame
|
uint32_t SFG_frameTime; ///< Keeps a constant time (in ms) during a frame
|
||||||
uint32_t SFG_gameFrame;
|
uint32_t SFG_gameFrame;
|
||||||
uint32_t SFG_lastFrameTimeMs;
|
uint32_t SFG_lastFrameTimeMs;
|
||||||
@ -313,10 +339,13 @@ struct
|
|||||||
uint8_t doorRecordCount;
|
uint8_t doorRecordCount;
|
||||||
uint8_t checkedDoorIndex; ///< Says which door are currently being checked.
|
uint8_t checkedDoorIndex; ///< Says which door are currently being checked.
|
||||||
|
|
||||||
SFG_ItemRecord itemRecords[SFG_MAX_LEVEL_ITEMS]; ///< Holds level items
|
SFG_ItemRecord itemRecords[SFG_MAX_ITEMS]; ///< Holds level items
|
||||||
uint8_t itemRecordCount;
|
uint8_t itemRecordCount;
|
||||||
uint8_t checkedItemIndex; ///< Same as checkedDoorIndex, but for items.
|
uint8_t checkedItemIndex; ///< Same as checkedDoorIndex, but for items.
|
||||||
|
|
||||||
|
SFG_MonsterRecord monsterRecords[SFG_MAX_MONSTERS];
|
||||||
|
uint8_t monsterRecordCount;
|
||||||
|
uint8_t checkedMonsterIndex;
|
||||||
} SFG_currentLevel;
|
} SFG_currentLevel;
|
||||||
|
|
||||||
#if SFG_DITHERED_SHADOW
|
#if SFG_DITHERED_SHADOW
|
||||||
@ -866,19 +895,42 @@ void SFG_setAndInitLevel(const SFG_Level *level)
|
|||||||
|
|
||||||
SFG_LOG("initializing level elements");
|
SFG_LOG("initializing level elements");
|
||||||
|
|
||||||
|
SFG_currentLevel.itemRecordCount = 0;
|
||||||
SFG_currentLevel.checkedItemIndex = 0;
|
SFG_currentLevel.checkedItemIndex = 0;
|
||||||
|
|
||||||
SFG_currentLevel.itemRecordCount = 0;
|
SFG_currentLevel.monsterRecordCount = 0;
|
||||||
|
SFG_currentLevel.checkedMonsterIndex = 0;
|
||||||
|
|
||||||
|
SFG_MonsterRecord *monster;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < SFG_MAX_LEVEL_ELEMENTS; ++i)
|
for (uint8_t i = 0; i < SFG_MAX_LEVEL_ELEMENTS; ++i)
|
||||||
{
|
{
|
||||||
const SFG_LevelElement *e = &(SFG_currentLevel.levelPointer->elements[i]);
|
const SFG_LevelElement *e = &(SFG_currentLevel.levelPointer->elements[i]);
|
||||||
|
|
||||||
if (e->elementType == SFG_LEVEL_ELEMENT_BARREL)
|
switch (e->elementType)
|
||||||
{
|
{
|
||||||
SFG_currentLevel.itemRecords[SFG_currentLevel.itemRecordCount] = i;
|
case SFG_LEVEL_ELEMENT_BARREL:
|
||||||
|
SFG_LOG("adding barrel");
|
||||||
|
SFG_currentLevel.itemRecords[SFG_currentLevel.itemRecordCount] = i;
|
||||||
|
SFG_currentLevel.itemRecordCount++;
|
||||||
|
break;
|
||||||
|
|
||||||
SFG_currentLevel.itemRecordCount++;
|
case SFG_LEVEL_ELEMENT_MONSTER1:
|
||||||
|
SFG_LOG("adding monster1");
|
||||||
|
|
||||||
|
monster =
|
||||||
|
&(SFG_currentLevel.monsterRecords[SFG_currentLevel.monsterRecordCount]);
|
||||||
|
|
||||||
|
monster->stateType = 0;
|
||||||
|
monster->health = 255;
|
||||||
|
monster->coords[0] = e->coords[0] * 4;
|
||||||
|
monster->coords[1] = e->coords[1] * 4;
|
||||||
|
|
||||||
|
SFG_currentLevel.monsterRecordCount++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1182,11 +1234,6 @@ void SFG_gameStep()
|
|||||||
&&
|
&&
|
||||||
RCL_absVal(SFG_player.squarePosition[1] - e.coords[1])
|
RCL_absVal(SFG_player.squarePosition[1] - e.coords[1])
|
||||||
<= SFG_LEVEL_ELEMENT_ACTIVE_DISTANCE
|
<= SFG_LEVEL_ELEMENT_ACTIVE_DISTANCE
|
||||||
&&
|
|
||||||
RCL_absVal(
|
|
||||||
SFG_player.camera.height -
|
|
||||||
SFG_floorHeightAt(e.coords[0],e.coords[1]))
|
|
||||||
<= (SFG_LEVEL_ELEMENT_ACTIVE_DISTANCE * RCL_UNITS_PER_SQUARE)
|
|
||||||
)
|
)
|
||||||
item |= SFG_ITEM_RECORD_ACTIVE_MASK;
|
item |= SFG_ITEM_RECORD_ACTIVE_MASK;
|
||||||
|
|
||||||
@ -1197,6 +1244,31 @@ void SFG_gameStep()
|
|||||||
if (SFG_currentLevel.checkedItemIndex >= SFG_currentLevel.itemRecordCount)
|
if (SFG_currentLevel.checkedItemIndex >= SFG_currentLevel.itemRecordCount)
|
||||||
SFG_currentLevel.checkedItemIndex = 0;
|
SFG_currentLevel.checkedItemIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// similarly handle monsters:
|
||||||
|
|
||||||
|
if (SFG_currentLevel.monsterRecordCount > 0) // has to be here
|
||||||
|
{
|
||||||
|
SFG_MonsterRecord *monster =
|
||||||
|
&(SFG_currentLevel.monsterRecords[SFG_currentLevel.checkedMonsterIndex]);
|
||||||
|
|
||||||
|
if (
|
||||||
|
RCL_absVal(SFG_player.squarePosition[0] - monster->coords[0] / 4)
|
||||||
|
<= SFG_LEVEL_ELEMENT_ACTIVE_DISTANCE
|
||||||
|
&&
|
||||||
|
RCL_absVal(SFG_player.squarePosition[1] - monster->coords[1] / 4)
|
||||||
|
<= SFG_LEVEL_ELEMENT_ACTIVE_DISTANCE
|
||||||
|
)
|
||||||
|
monster->stateType = SFG_MONSTER_STATE_IDLE;
|
||||||
|
else
|
||||||
|
monster->stateType = SFG_MONSTER_STATE_INACTIVE;
|
||||||
|
|
||||||
|
SFG_currentLevel.checkedMonsterIndex++;
|
||||||
|
|
||||||
|
if (SFG_currentLevel.checkedMonsterIndex >=
|
||||||
|
SFG_currentLevel.monsterRecordCount)
|
||||||
|
SFG_currentLevel.checkedMonsterIndex = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SFG_clearScreen(uint8_t color)
|
void SFG_clearScreen(uint8_t color)
|
||||||
@ -1412,6 +1484,7 @@ void SFG_draw()
|
|||||||
|
|
||||||
// draw sprites:
|
// draw sprites:
|
||||||
|
|
||||||
|
// item sprites:
|
||||||
for (uint8_t i = 0; i < SFG_currentLevel.itemRecordCount; ++i)
|
for (uint8_t i = 0; i < SFG_currentLevel.itemRecordCount; ++i)
|
||||||
if (SFG_currentLevel.itemRecords[i] & SFG_ITEM_RECORD_ACTIVE_MASK)
|
if (SFG_currentLevel.itemRecords[i] & SFG_ITEM_RECORD_ACTIVE_MASK)
|
||||||
{
|
{
|
||||||
@ -1440,13 +1513,38 @@ void SFG_draw()
|
|||||||
p.depth / (RCL_UNITS_PER_SQUARE * 2),p.depth);
|
p.depth / (RCL_UNITS_PER_SQUARE * 2),p.depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// monster sprites:
|
||||||
|
for (uint8_t i = 0; i < SFG_currentLevel.monsterRecordCount; ++i)
|
||||||
|
{
|
||||||
|
SFG_MonsterRecord m = SFG_currentLevel.monsterRecords[i];
|
||||||
|
|
||||||
|
if (m.stateType != SFG_MONSTER_STATE_INACTIVE)
|
||||||
|
{
|
||||||
|
RCL_Vector2D worldPosition;
|
||||||
|
|
||||||
|
worldPosition.x = m.coords[0] * RCL_UNITS_PER_SQUARE / 4;
|
||||||
|
worldPosition.y = m.coords[1] * RCL_UNITS_PER_SQUARE / 4;
|
||||||
|
|
||||||
|
RCL_PixelInfo p =
|
||||||
|
RCL_mapToScreen(
|
||||||
|
worldPosition,
|
||||||
|
SFG_floorHeightAt(m.coords[0] / 4,
|
||||||
|
m.coords[1] / 4) + RCL_UNITS_PER_SQUARE / 2,
|
||||||
|
SFG_player.camera);
|
||||||
|
|
||||||
|
if (p.depth > 0)
|
||||||
|
SFG_drawScaledSprite(SFG_monsterSprites[0],
|
||||||
|
p.position.x * SFG_RAYCASTING_SUBSAMPLE,p.position.y,
|
||||||
|
RCL_perspectiveScale(SFG_GAME_RESOLUTION_Y,p.depth),
|
||||||
|
p.depth / (RCL_UNITS_PER_SQUARE * 2),p.depth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if SFG_HEADBOB_ENABLED
|
#if SFG_HEADBOB_ENABLED
|
||||||
// substract head bob after rendering
|
// substract head bob after rendering
|
||||||
SFG_player.camera.height -= headBobOffset;
|
SFG_player.camera.height -= headBobOffset;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SFG_drawText("124",10,SFG_GAME_RESOLUTION_Y - 10 - SFG_FONT_CHARACTER_SIZE * SFG_FONT_SIZE_MEDIUM,SFG_FONT_SIZE_MEDIUM,7);
|
SFG_drawText("124",10,SFG_GAME_RESOLUTION_Y - 10 - SFG_FONT_CHARACTER_SIZE * SFG_FONT_SIZE_MEDIUM,SFG_FONT_SIZE_MEDIUM,7);
|
||||||
SFG_drawText("ammo",
|
SFG_drawText("ammo",
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ int main()
|
|||||||
{
|
{
|
||||||
pokitto.begin();
|
pokitto.begin();
|
||||||
|
|
||||||
pokitto.setFrameRate(SFG_FPS);
|
pokitto.setFrameRate(255);
|
||||||
pokitto.display.setFont(fontTiny);
|
pokitto.display.setFont(fontTiny);
|
||||||
pokitto.display.persistence = 1;
|
pokitto.display.persistence = 1;
|
||||||
pokitto.display.setInvisibleColor(-1);
|
pokitto.display.setInvisibleColor(-1);
|
||||||
|
Loading…
Reference in New Issue
Block a user