Compare commits
	
		
			2 Commits
		
	
	
		
			3070b9864c
			...
			adb0a49711
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| adb0a49711 | |||
| cff18b088e | 
							
								
								
									
										12
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								build.gradle
									
									
									
									
									
								
							@ -18,9 +18,9 @@ test {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dependencies {
 | 
					dependencies {
 | 
				
			||||||
    implementation "com.fasterxml.jackson.core:jackson-core:2.12.3"
 | 
					    implementation 'com.fasterxml.jackson.core:jackson-core:2.12.4'
 | 
				
			||||||
    implementation "com.fasterxml.jackson.core:jackson-annotations:2.12.3"
 | 
					    implementation 'com.fasterxml.jackson.core:jackson-annotations:2.12.4'
 | 
				
			||||||
    implementation "com.fasterxml.jackson.core:jackson-databind:2.12.3"
 | 
					    implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.4'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    implementation "org.hibernate.validator:hibernate-validator:7.0.1.Final"
 | 
					    implementation "org.hibernate.validator:hibernate-validator:7.0.1.Final"
 | 
				
			||||||
    implementation "org.glassfish:jakarta.el:4.0.1"
 | 
					    implementation "org.glassfish:jakarta.el:4.0.1"
 | 
				
			||||||
@ -28,10 +28,10 @@ dependencies {
 | 
				
			|||||||
    implementation "org.tinylog:tinylog-api:2.4.0-M1"
 | 
					    implementation "org.tinylog:tinylog-api:2.4.0-M1"
 | 
				
			||||||
    implementation "org.tinylog:tinylog-impl:2.4.0-M1"
 | 
					    implementation "org.tinylog:tinylog-impl:2.4.0-M1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    testImplementation "net.jqwik:jqwik:1.5.1"
 | 
					    testImplementation 'net.jqwik:jqwik:1.5.3'
 | 
				
			||||||
    testImplementation "org.junit.jupiter:junit-jupiter-api:5.8.0-M1"
 | 
					    testImplementation "org.junit.jupiter:junit-jupiter-api:5.8.0-M1"
 | 
				
			||||||
    testImplementation "org.mockito:mockito-core:3.+"
 | 
					    testImplementation 'org.mockito:mockito-core:3.11.2'
 | 
				
			||||||
    testImplementation "org.assertj:assertj-core:3.19.0"
 | 
					    testImplementation 'org.assertj:assertj-core:3.20.2'
 | 
				
			||||||
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.8.0-M1"
 | 
					    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.8.0-M1"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@ public class GameLogic {
 | 
				
			|||||||
     * Checks a {@link Request} for validity for a {@link GameState}.
 | 
					     * Checks a {@link Request} for validity for a {@link GameState}.
 | 
				
			||||||
     * @param state The game state to check on
 | 
					     * @param state The game state to check on
 | 
				
			||||||
     * @param request The request to validate
 | 
					     * @param request The request to validate
 | 
				
			||||||
     * @return Whether or not the request is valid
 | 
					     * @return Whether the request is valid
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    protected static boolean checkRequest(GameState state, Request request) {
 | 
					    protected static boolean checkRequest(GameState state, Request request) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
@ -36,15 +36,20 @@ public class GameLogic {
 | 
				
			|||||||
                    CharacterRequest data = (CharacterRequest)request;
 | 
					                    CharacterRequest data = (CharacterRequest)request;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    Character origin = getCharacter(state, data.originField, data.originEntity);
 | 
					                    Character origin = getCharacter(state, data.originField, data.originEntity);
 | 
				
			||||||
                    Character target = getCharacter(state, data.targetField, data.targetEntity);
 | 
					                    Entity target = getAttackable(state, data.targetField, data.targetEntity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    requireTurn(state, origin);
 | 
					                    requireTurn(state, origin);
 | 
				
			||||||
                    requireOppositeTeam(origin, target);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    requireAlive(origin);
 | 
					                    requireAlive(origin);
 | 
				
			||||||
                    requireAlive(target);
 | 
					 | 
				
			||||||
                    requireAP(origin, 1);
 | 
					                    requireAP(origin, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if(target instanceof Character) {
 | 
				
			||||||
 | 
					                        Character targetCharacter = (Character)target;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        requireOppositeTeam(origin, targetCharacter);
 | 
				
			||||||
 | 
					                        requireAlive(targetCharacter);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if(request.type == RequestType.MeleeAttackRequest) {
 | 
					                    if(request.type == RequestType.MeleeAttackRequest) {
 | 
				
			||||||
                        if(origin.meleeDamage != data.value) {
 | 
					                        if(origin.meleeDamage != data.value) {
 | 
				
			||||||
                            throw new InvalidRequestException("Invalid melee damage");
 | 
					                            throw new InvalidRequestException("Invalid melee damage");
 | 
				
			||||||
@ -183,6 +188,22 @@ public class GameLogic {
 | 
				
			|||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Retrieves an attack-able Entity ({@link Character} or {@link Rock}) for a {@link Request}.
 | 
				
			||||||
 | 
					     * @param state The game state to use
 | 
				
			||||||
 | 
					     * @param position The requested position
 | 
				
			||||||
 | 
					     * @param entityID The requested {@link EntityID}
 | 
				
			||||||
 | 
					     * @return The found entity
 | 
				
			||||||
 | 
					     * @throws InvalidRequestException if the entity is invalid or not found
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static Entity getAttackable(GameState state, IntVector2 position, EntityID entityID) throws InvalidRequestException {
 | 
				
			||||||
 | 
					        Entity entity = state.entities.findEntity(entityID);
 | 
				
			||||||
 | 
					        if(entity == null || !entity.getPosition().equals(position) || (!(entity instanceof Character) && !(entity instanceof Rock)) || entity.id.type == EntityType.NPC) {
 | 
				
			||||||
 | 
					            throw new InvalidRequestException("Invalid target character or rock");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return entity;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Retrieves a {@link Character} for a {@link Request}.
 | 
					     * Retrieves a {@link Character} for a {@link Request}.
 | 
				
			||||||
     * @param state The game state to use
 | 
					     * @param state The game state to use
 | 
				
			||||||
@ -315,23 +336,34 @@ public class GameLogic {
 | 
				
			|||||||
                        .withAmount(data.value)
 | 
					                        .withAmount(data.value)
 | 
				
			||||||
                        .buildEntityEvent());
 | 
					                        .buildEntityEvent());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Character target = (Character)state.entities.findEntity(data.targetEntity);
 | 
					                Entity targetEntity = state.entities.findEntity(data.targetEntity);
 | 
				
			||||||
                if(target.hp.getValue() <= data.value) {
 | 
					                if(targetEntity instanceof Character) {
 | 
				
			||||||
 | 
					                    Character target = (Character)targetEntity;
 | 
				
			||||||
 | 
					                    if(target.hp.getValue() <= data.value) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    List<StoneType> stones = Arrays.asList(target.inventory.getStonesAsArray());
 | 
					                        List<StoneType> stones = Arrays.asList(target.inventory.getStonesAsArray());
 | 
				
			||||||
                    Collections.shuffle(stones); // required by documents
 | 
					                        Collections.shuffle(stones); // required by documents
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    ArrayList<IntVector2> used = new ArrayList<>();
 | 
					                        ArrayList<IntVector2> used = new ArrayList<>();
 | 
				
			||||||
                    for(StoneType stone: stones) {
 | 
					                        for(StoneType stone: stones) {
 | 
				
			||||||
                        ArrayList<IntVector2> options = getFreeNeighbour(state, target.getPosition(), used);
 | 
					                            ArrayList<IntVector2> options = getFreeNeighbour(state, target.getPosition(), used);
 | 
				
			||||||
                        IntVector2 picked = options.get(rand.nextInt(options.size()));
 | 
					                            IntVector2 picked = options.get(rand.nextInt(options.size()));
 | 
				
			||||||
                        used.add(picked);
 | 
					                            used.add(picked);
 | 
				
			||||||
                        result.add(new EventBuilder(EventType.SpawnEntityEvent)
 | 
					                            result.add(new EventBuilder(EventType.SpawnEntityEvent)
 | 
				
			||||||
                                .withEntity(new InfinityStone(
 | 
					                                    .withEntity(new InfinityStone(
 | 
				
			||||||
                                        new EntityID(EntityType.InfinityStones, stone.getID()),
 | 
					                                            new EntityID(EntityType.InfinityStones, stone.getID()),
 | 
				
			||||||
                                        picked,
 | 
					                                            picked,
 | 
				
			||||||
                                        stone
 | 
					                                            stone
 | 
				
			||||||
                                ))
 | 
					                                    ))
 | 
				
			||||||
 | 
					                                    .buildEntityEvent());
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }else if(targetEntity instanceof Rock) {
 | 
				
			||||||
 | 
					                    Rock target = (Rock)targetEntity;
 | 
				
			||||||
 | 
					                    if(target.getHp() <= data.value) {
 | 
				
			||||||
 | 
					                        result.add(new EventBuilder(EventType.DestroyedEntityEvent)
 | 
				
			||||||
 | 
					                                .withTargetField(data.targetField)
 | 
				
			||||||
 | 
					                                .withTargetEntity(target.id)
 | 
				
			||||||
                                .buildEntityEvent());
 | 
					                                .buildEntityEvent());
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -526,19 +558,26 @@ public class GameLogic {
 | 
				
			|||||||
            case TakenDamageEvent -> {
 | 
					            case TakenDamageEvent -> {
 | 
				
			||||||
                EntityEvent data = (EntityEvent)event;
 | 
					                EntityEvent data = (EntityEvent)event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Character target = (Character)state.entities.findEntity(data.targetEntity);
 | 
					                Entity targetEntity = state.entities.findEntity(data.targetEntity);
 | 
				
			||||||
                target.hp.decreaseValue(data.amount);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                EntityType opposing = target.id.type == EntityType.P1 ? EntityType.P2 : EntityType.P1;
 | 
					                if(targetEntity instanceof Character) {
 | 
				
			||||||
                state.winConditions.increaseValue(opposing, WinCondition.TotalDamage, data.amount);
 | 
					                    Character target = (Character)targetEntity;
 | 
				
			||||||
                if(!target.isAlive()) {
 | 
					                    target.hp.decreaseValue(data.amount);
 | 
				
			||||||
                    target.inventory.clear();
 | 
					 | 
				
			||||||
                    state.winConditions.increaseValue(opposing, WinCondition.TotalKnockouts, 1);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if(state.activeCharacter != null && state.activeCharacter.type == EntityType.NPC && state.activeCharacter.id == NPCType.Thanos.getID()) {
 | 
					                    EntityType opposing = target.id.type == EntityType.P1 ? EntityType.P2 : EntityType.P1;
 | 
				
			||||||
                    NPC thanos = (NPC)state.entities.findEntity(state.activeCharacter);
 | 
					                    state.winConditions.increaseValue(opposing, WinCondition.TotalDamage, data.amount);
 | 
				
			||||||
                    target.inventory.transfer(thanos.inventory);
 | 
					                    if(!target.isAlive()) {
 | 
				
			||||||
 | 
					                        target.inventory.clear();
 | 
				
			||||||
 | 
					                        state.winConditions.increaseValue(opposing, WinCondition.TotalKnockouts, 1);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if(state.activeCharacter != null && state.activeCharacter.type == EntityType.NPC && state.activeCharacter.id == NPCType.Thanos.getID()) {
 | 
				
			||||||
 | 
					                        NPC thanos = (NPC)state.entities.findEntity(state.activeCharacter);
 | 
				
			||||||
 | 
					                        target.inventory.transfer(thanos.inventory);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }else if(targetEntity instanceof Rock) {
 | 
				
			||||||
 | 
					                    Rock target = (Rock)targetEntity;
 | 
				
			||||||
 | 
					                    target.decreaseHp(data.amount);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            case ConsumedAPEvent -> {
 | 
					            case ConsumedAPEvent -> {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user