|
|
|
|
@ -11,18 +11,18 @@
|
|
|
|
|
#include "../definitions.h"
|
|
|
|
|
#include "../MapObject/staticobjects.h"
|
|
|
|
|
|
|
|
|
|
void DrawRect(Vector2 rectStart, Vector2 *mousePosition){
|
|
|
|
|
float width = GetMousePosition().x - rectStart.x;
|
|
|
|
|
float height = GetMousePosition().y - rectStart.y;
|
|
|
|
|
void DrawRect(Vector2 rectStart, Vector2 mousePosition){
|
|
|
|
|
float width = abs(mousePosition.x - rectStart.x);
|
|
|
|
|
float height = abs(mousePosition.y - rectStart.y);
|
|
|
|
|
rectStart = GetRectangle(rectStart, mousePosition);
|
|
|
|
|
|
|
|
|
|
rectStart = GetRectangle(rectStart);
|
|
|
|
|
|
|
|
|
|
DrawRectangleLines(rectStart.x, rectStart.y, abs(width), abs(height), GREEN);
|
|
|
|
|
DrawRectangleLines(rectStart.x, rectStart.y, width, height, GREEN);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Vector2 GetRectangle(Vector2 rectStart){
|
|
|
|
|
float width = GetMousePosition().x - rectStart.x;
|
|
|
|
|
float height = GetMousePosition().y - rectStart.y;
|
|
|
|
|
// RETURNS UPPER LEFT CORNER OF THE RECTANGLE USING CURRENT MOUSE POS
|
|
|
|
|
Vector2 GetRectangle(Vector2 rectStart, Vector2 mousePos){
|
|
|
|
|
float width = mousePos.x - rectStart.x;
|
|
|
|
|
float height = mousePos.y - rectStart.y;
|
|
|
|
|
|
|
|
|
|
if(width < 0 && height >= 0){
|
|
|
|
|
width *= -1;
|
|
|
|
|
@ -41,178 +41,150 @@ Vector2 GetRectangle(Vector2 rectStart){
|
|
|
|
|
return rectStart;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void SelectEntitiesInsideSelectionRect(Game *game){
|
|
|
|
|
// UNSELECTING EVERY ENTITY FIRST, IF NOT HOLDING SHIFT
|
|
|
|
|
Entity *current = game->entities->head;
|
|
|
|
|
if(!IsKeyDown(KEY_LEFT_SHIFT)){
|
|
|
|
|
while (current != 0){
|
|
|
|
|
current->selected = 0;
|
|
|
|
|
current = current->next;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Vector2 rect = GetRectangle(game->inputHandler->rectStart, game->inputHandler->cursorPos);
|
|
|
|
|
float rectWidth = abs(GetMousePosition().x - game->inputHandler->rectStart.x);
|
|
|
|
|
float rectHeight = abs(GetMousePosition().y - game->inputHandler->rectStart.y);
|
|
|
|
|
|
|
|
|
|
current = game->entities->head;
|
|
|
|
|
float deltaX;
|
|
|
|
|
float deltaY;
|
|
|
|
|
// THEN SELECTING ENTITIES
|
|
|
|
|
while (current != 0){
|
|
|
|
|
Vector2 currPos = {current->sprite->x + current->sprite->texture->width, current->sprite->y + current->sprite->texture->height/2};
|
|
|
|
|
IsometricMapUnproject(game->map, game->camera, currPos.x, currPos.y, current->sprite->z, &currPos);
|
|
|
|
|
|
|
|
|
|
deltaX = currPos.x - game->camera->target.x - (rect.x + game->camera->target.x);
|
|
|
|
|
deltaY = currPos.y - game->camera->target.y - (rect.y + game->camera->target.y);
|
|
|
|
|
|
|
|
|
|
if(deltaX > 0 && deltaX < rectWidth && deltaY > 0 && deltaY < rectHeight){
|
|
|
|
|
current->selected = 1;
|
|
|
|
|
}
|
|
|
|
|
current = current->next;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void mouseInput(Game *game){
|
|
|
|
|
|
|
|
|
|
InputHandler *inputHandler = game->inputHandler;
|
|
|
|
|
EntityList *entities = game->entities;
|
|
|
|
|
Camera2D *camera = game->camera;
|
|
|
|
|
IsometricMap *map = game->map;
|
|
|
|
|
Texture2D *texture = game->worker +4;
|
|
|
|
|
/* --- UPDATING INPUT VECTOR VARIABLES --- */
|
|
|
|
|
|
|
|
|
|
inputHandler->cursorPos.x = GetMousePosition().x;
|
|
|
|
|
inputHandler->cursorPos.y = GetMousePosition().y;
|
|
|
|
|
game->inputHandler->cursorPos.x = GetMousePosition().x;
|
|
|
|
|
game->inputHandler->cursorPos.y = GetMousePosition().y;
|
|
|
|
|
|
|
|
|
|
// resetting last selected Tile to grass texture
|
|
|
|
|
IsometricMapChangeTextureIdOfTile(game->map, (int) game->inputHandler->cursorWorldTile.x, (int) game->inputHandler->cursorWorldTile.y, 0);
|
|
|
|
|
|
|
|
|
|
// bissl Kamera Zoom
|
|
|
|
|
float maxZoom = 5.0f;
|
|
|
|
|
float minZoom = 0.2f;
|
|
|
|
|
if(IsKeyPressed(KEY_I)){
|
|
|
|
|
if(camera->zoom < maxZoom){
|
|
|
|
|
camera->zoom += 0.2f;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(IsKeyPressed(KEY_K)){
|
|
|
|
|
if(camera->zoom > minZoom){
|
|
|
|
|
camera->zoom -= 0.2f;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Updating cursorWorldPos
|
|
|
|
|
IsometricMapProject(game->map, game->camera,
|
|
|
|
|
(game->inputHandler->cursorPos.x / game->camera->zoom) - (game->map->textureWidth / 2),
|
|
|
|
|
(game->inputHandler->cursorPos.y / game->camera->zoom) - (game->map->textureHeight / 4),
|
|
|
|
|
&game->inputHandler->cursorWorldPos);
|
|
|
|
|
|
|
|
|
|
// Temp code for testing HOLZHACKERLEUTE, weil ich net versteh wie die iButtons hmmpf. früher bescheid wisse!
|
|
|
|
|
if(IsKeyPressed(KEY_G)){
|
|
|
|
|
//Baum
|
|
|
|
|
StaticObject *tree = StaticObjectInit(game, SO_PINETREE, inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y);
|
|
|
|
|
StaticObjectListInsert(game->objects, tree);
|
|
|
|
|
// Updating cursorWorldTile
|
|
|
|
|
Tile *currentlySelectedTile = IsometricMapGetTileFromWorldCoordinates(game->map, game->inputHandler->cursorWorldPos.x, game->inputHandler->cursorWorldPos.y);
|
|
|
|
|
if(currentlySelectedTile != 0){
|
|
|
|
|
game->inputHandler->cursorWorldTile.x = currentlySelectedTile->x;
|
|
|
|
|
game->inputHandler->cursorWorldTile.y = currentlySelectedTile->y;
|
|
|
|
|
// setting the currently selected Tile to "selected" Texture
|
|
|
|
|
IsometricMapChangeTextureIdOfTile(game->map, (int) game->inputHandler->cursorWorldTile.x, (int) game->inputHandler->cursorWorldTile.y, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(IsKeyPressed(KEY_H)){
|
|
|
|
|
//Holzkacker
|
|
|
|
|
Entity *lumberjack = EntityInit(game, PR_LUMBERJACK, inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y);
|
|
|
|
|
EntityListInsert(game->entities, lumberjack);
|
|
|
|
|
}
|
|
|
|
|
/* --- CURSOR SPRITE --- */
|
|
|
|
|
|
|
|
|
|
// resetting last selected Tile to grass texture
|
|
|
|
|
if(inputHandler->selectedLayer != -1){
|
|
|
|
|
IsometricMapChangeTextureIdOfTile(map, (int) inputHandler->cursorWorldTile.x, (int) inputHandler->cursorWorldTile.y, 0);
|
|
|
|
|
if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){
|
|
|
|
|
game->cursorSprite->texture = &game->textures->textures[TE_CURSOR][1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// hardcoded layer amount
|
|
|
|
|
float tileWidthHalf = map->tileTextures[0].width / 2;
|
|
|
|
|
float tileHeightQuarter = map->tileTextures[0].height / 4;
|
|
|
|
|
int mouseAdjustmentX = -tileWidthHalf;
|
|
|
|
|
int mouseAdjustmentY = -tileHeightQuarter;
|
|
|
|
|
|
|
|
|
|
// Updating inputHandler->cursorWorldPos Vector2D
|
|
|
|
|
IsometricMapProject(map, camera,
|
|
|
|
|
(inputHandler->cursorPos.x / camera->zoom) + mouseAdjustmentX,
|
|
|
|
|
(inputHandler->cursorPos.y / camera->zoom) + mouseAdjustmentY,
|
|
|
|
|
&inputHandler->cursorWorldPos);
|
|
|
|
|
|
|
|
|
|
Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(game->map, inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y);
|
|
|
|
|
|
|
|
|
|
if(selectedTile != 0){
|
|
|
|
|
inputHandler->selectedLayer = 0;
|
|
|
|
|
inputHandler->cursorWorldTile.x = selectedTile->x;
|
|
|
|
|
inputHandler->cursorWorldTile.y = selectedTile->y;
|
|
|
|
|
// setting currently selected tile to tower
|
|
|
|
|
IsometricMapChangeTextureIdOfTile(map, inputHandler->cursorWorldTile.x, inputHandler->cursorWorldTile.y, 1);
|
|
|
|
|
else if(IsMouseButtonReleased(MOUSE_BUTTON_LEFT)){
|
|
|
|
|
game->cursorSprite->texture = &game->textures->textures[TE_CURSOR][0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(game->mouseOnUI == 0){
|
|
|
|
|
if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){
|
|
|
|
|
if(inputHandler->pressed == 0){
|
|
|
|
|
inputHandler->rectStart.x = GetMousePosition().x;
|
|
|
|
|
inputHandler->rectStart.y = GetMousePosition().y;
|
|
|
|
|
inputHandler->pressed = 1;
|
|
|
|
|
/* --- SELECTION RECT --- */
|
|
|
|
|
|
|
|
|
|
// Cursorsprite is changed to "down"
|
|
|
|
|
game->cursorSprite->texture = &game->textures->textures[TE_CURSOR][1];
|
|
|
|
|
// Creating new Selection Rect
|
|
|
|
|
if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){
|
|
|
|
|
if(game->mouseOnUI == 0){
|
|
|
|
|
if(game->inputHandler->selectionRectActive == 0){
|
|
|
|
|
game->inputHandler->rectStart.x = GetMousePosition().x;
|
|
|
|
|
game->inputHandler->rectStart.y = GetMousePosition().y;
|
|
|
|
|
game->inputHandler->selectionRectActive = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Drawing Rect while selectionRectActive
|
|
|
|
|
if(game->inputHandler->selectionRectActive == 1){
|
|
|
|
|
DrawRect(game->inputHandler->rectStart, game->inputHandler->cursorPos);
|
|
|
|
|
}
|
|
|
|
|
if(IsMouseButtonReleased(MOUSE_BUTTON_LEFT)){
|
|
|
|
|
game->inputHandler->selectionRectActive = 0;
|
|
|
|
|
SelectEntitiesInsideSelectionRect(game);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(inputHandler->pressed){
|
|
|
|
|
DrawRect(inputHandler->rectStart, &(inputHandler->cursorPos));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(game->mouseOnUI == 0){
|
|
|
|
|
if(IsMouseButtonReleased(MOUSE_BUTTON_LEFT)){
|
|
|
|
|
inputHandler->pressed = 0;
|
|
|
|
|
// Cursorsprite is changed back to normal
|
|
|
|
|
game->cursorSprite->texture = &game->textures->textures[TE_CURSOR][0];
|
|
|
|
|
float width = GetMousePosition().x - inputHandler->rectStart.x;
|
|
|
|
|
float height = GetMousePosition().y - inputHandler->rectStart.y;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Add Sprite
|
|
|
|
|
if(abs(width) + abs(height) < 20){
|
|
|
|
|
int maxWidth = (game->map->width) * game->map->textureWidth;
|
|
|
|
|
int maxHeight = (game->map->height) * game->map->textureHeight;
|
|
|
|
|
if(inputHandler->cursorWorldPos.x < 0){ printf("OutOfBoundsDestination Spawn\n");}
|
|
|
|
|
else if(inputHandler->cursorWorldPos.y < 0){ printf("OutOfBoundsDestination Spawn\n");}
|
|
|
|
|
else if(inputHandler->cursorWorldPos.x > maxWidth){ printf("OutOfBoundsDestination Spawn\n");}
|
|
|
|
|
else if(inputHandler->cursorWorldPos.y > maxHeight){ printf("OutOfBoundsDestination Spawn\n");}
|
|
|
|
|
else {
|
|
|
|
|
//Sprite *newSprite = SpriteCreate(game->textures, TE_WORKER, inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y);
|
|
|
|
|
//Entity *entity = EntityInit(newSprite, PR_BUILDER, game->textures);
|
|
|
|
|
//EntityListInsert(game->entities, entity);
|
|
|
|
|
//SpriteListInsert(game->sprites, newSprite);
|
|
|
|
|
//ListPrintForward(sprites);
|
|
|
|
|
//ListInsertSorted(sprites, SpriteCreate(game->textures, 1, inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y));
|
|
|
|
|
}
|
|
|
|
|
} else{
|
|
|
|
|
// Berechnung, welche Sprites ausgewählt wurden
|
|
|
|
|
Vector2 rect = GetRectangle(inputHandler->rectStart);
|
|
|
|
|
width = abs(width);
|
|
|
|
|
height = abs(height);
|
|
|
|
|
|
|
|
|
|
float deltaX;
|
|
|
|
|
float deltaY;
|
|
|
|
|
Entity *current = game->entities->head;
|
|
|
|
|
while (current != 0){
|
|
|
|
|
Vector2 currPos = {current->sprite->x + current->sprite->texture->width, current->sprite->y + current->sprite->texture->height/2};
|
|
|
|
|
IsometricMapUnproject(map, camera, currPos.x, currPos.y, current->sprite->z, &currPos);
|
|
|
|
|
|
|
|
|
|
deltaX = currPos.x - camera->target.x - (rect.x + camera->target.x);
|
|
|
|
|
deltaY = currPos.y - camera->target.y - (rect.y + camera->target.y);
|
|
|
|
|
|
|
|
|
|
if(deltaX > 0 && deltaX < width && deltaY > 0 && deltaY < height){
|
|
|
|
|
current->selected = 1;
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
current->selected = 0;
|
|
|
|
|
}
|
|
|
|
|
current = current->next;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* --- SETTING DESTINATION FOR SELECTED ENTITIES --- */
|
|
|
|
|
|
|
|
|
|
if(IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)){
|
|
|
|
|
if(IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)){
|
|
|
|
|
float destX = game->inputHandler->cursorWorldPos.x;
|
|
|
|
|
float destY = game->inputHandler->cursorWorldPos.y;
|
|
|
|
|
int maxWidth = (game->map->width) * game->map->textureWidth;
|
|
|
|
|
int maxHeight = (game->map->height) * game->map->textureHeight;
|
|
|
|
|
if(destX < 0 || destY < 0 || destX > maxWidth || destY > maxHeight){
|
|
|
|
|
printf("OutOfBoundsDestination\n");
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
Entity *current = game->entities->head;
|
|
|
|
|
|
|
|
|
|
while (current != 0){
|
|
|
|
|
if(current->selected){
|
|
|
|
|
current->hasDestination = 1;
|
|
|
|
|
float destX = inputHandler->cursorWorldPos.x;
|
|
|
|
|
float destY = inputHandler->cursorWorldPos.y;
|
|
|
|
|
int maxWidth = (game->map->width-1) * game->map->textureWidth;
|
|
|
|
|
int maxHeight = (game->map->height-1) * game->map->textureHeight;
|
|
|
|
|
if(destX < 0){ printf("OutOfBoundsDestination\n"); goto skip; }
|
|
|
|
|
if(destY < 0){ printf("OutOfBoundsDestination\n"); goto skip; }
|
|
|
|
|
if(destX > maxWidth){ printf("OutOfBoundsDestination\n"); goto skip; }
|
|
|
|
|
if(destY > maxHeight){ printf("OutOfBoundsDestination\n"); goto skip; }
|
|
|
|
|
|
|
|
|
|
current->destX = destX;
|
|
|
|
|
current->destY = destY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
skip: current = current->next;
|
|
|
|
|
current = current->next;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void keyboardInput(InputHandler *inputHandler, Camera2D *camera){
|
|
|
|
|
void keyboardInput(Game *game){
|
|
|
|
|
// Kamera Movement
|
|
|
|
|
float camSpeed = 1000.0f;
|
|
|
|
|
if(IsKeyDown(KEY_W)){
|
|
|
|
|
(*camera).target.y -= camSpeed * GetFrameTime();
|
|
|
|
|
game->camera->target.y -= camSpeed * GetFrameTime();
|
|
|
|
|
}
|
|
|
|
|
if(IsKeyDown(KEY_S)){
|
|
|
|
|
(*camera).target.y += camSpeed * GetFrameTime();
|
|
|
|
|
game->camera->target.y += camSpeed * GetFrameTime();
|
|
|
|
|
}
|
|
|
|
|
if(IsKeyDown(KEY_D)){
|
|
|
|
|
(*camera).target.x += camSpeed * GetFrameTime();
|
|
|
|
|
game->camera->target.x += camSpeed * GetFrameTime();
|
|
|
|
|
}
|
|
|
|
|
if(IsKeyDown(KEY_A)){
|
|
|
|
|
(*camera).target.x -= camSpeed * GetFrameTime();
|
|
|
|
|
game->camera->target.x -= camSpeed * GetFrameTime();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// bissl Kamera Zoom
|
|
|
|
|
float maxZoom = 5.0f;
|
|
|
|
|
float minZoom = 0.2f;
|
|
|
|
|
if(IsKeyPressed(KEY_I)){
|
|
|
|
|
if(game->camera->zoom < maxZoom){
|
|
|
|
|
game->camera->zoom += 0.2f;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(IsKeyPressed(KEY_K)){
|
|
|
|
|
if(game->camera->zoom > minZoom){
|
|
|
|
|
game->camera->zoom -= 0.2f;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Temp code for testing HOLZHACKERLEUTE, weil ich net versteh wie die iButtons hmmpf. früher bescheid wisse!
|
|
|
|
|
if(IsKeyPressed(KEY_G)){
|
|
|
|
|
//Baum
|
|
|
|
|
StaticObject *tree = StaticObjectInit(game, SO_PINETREE, game->inputHandler->cursorWorldPos.x, game->inputHandler->cursorWorldPos.y);
|
|
|
|
|
StaticObjectListInsert(game->objects, tree);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|