Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 69 additions & 10 deletions lib/const/coordinate_system.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import 'dart:math' as math;

import 'package:flutter/material.dart';

class CoordinateSystem {
// System parameters

CoordinateSystem._({required Size playAreaSize})
: _playAreaSize = playAreaSize;
: _playAreaSize = playAreaSize;

final Size _playAreaSize;
Size get playAreaSize => _playAreaSize;
Expand All @@ -28,6 +30,67 @@ class CoordinateSystem {
final double mapAspectRatio = defaultMapAspectRatio;
final double worldAspectRatio = 16 / 9;

/// Placed object data is always authored in the attack-side world.
///
/// Defense is the same world rotated 180 degrees. Keeping that projection
/// here makes the conversion reversible and keeps side changes out of saved
/// positions.
Offset positionForSide({
required Offset canonicalPosition,
required Offset reflectionOffset,
required bool isAttack,
}) {
if (isAttack) return canonicalPosition;
return Offset(
worldNormalizedWidth - canonicalPosition.dx - reflectionOffset.dx,
normalizedHeight - canonicalPosition.dy - reflectionOffset.dy,
);
}

Offset positionFromSide({
required Offset sidePosition,
required Offset reflectionOffset,
required bool isAttack,
}) {
return positionForSide(
canonicalPosition: sidePosition,
reflectionOffset: reflectionOffset,
isAttack: isAttack,
);
}

Offset screenPositionForSide({
required Offset attackScreenPosition,
required Offset reflectionOffset,
required bool isAttack,
}) {
if (isAttack) return attackScreenPosition;
return Offset(
_effectiveSize.width - attackScreenPosition.dx - reflectionOffset.dx,
_effectiveSize.height - attackScreenPosition.dy - reflectionOffset.dy,
);
}

Offset screenPositionFromSide({
required Offset sideScreenPosition,
required Offset reflectionOffset,
required bool isAttack,
}) {
return screenPositionForSide(
attackScreenPosition: sideScreenPosition,
reflectionOffset: reflectionOffset,
isAttack: isAttack,
);
}

double rotationForSide(double canonicalRotation, {required bool isAttack}) {
return isAttack ? canonicalRotation : canonicalRotation + math.pi;
}

double rotationFromSide(double sideRotation, {required bool isAttack}) {
return isAttack ? sideRotation : sideRotation - math.pi;
}

double get mapNormalizedWidth => normalizedHeight * mapAspectRatio;
double get worldNormalizedWidth => normalizedHeight * worldAspectRatio;
double get mapPaddingNormalizedX =>
Expand All @@ -41,7 +104,8 @@ class CoordinateSystem {
static CoordinateSystem get instance {
if (_instance == null) {
throw StateError(
"CoordinateSystem must be initialized with playAreaSize first");
"CoordinateSystem must be initialized with playAreaSize first",
);
}
return _instance!;
}
Expand Down Expand Up @@ -127,20 +191,15 @@ class CoordinateSystem {

double normalize(double value) => (value / _scaleFactor);
// Scale a size maintaining aspect ratio
Size scaleSize(Size size) => Size(
size.width * _scaleFactor,
size.height * _scaleFactor,
);
Size scaleSize(Size size) =>
Size(size.width * _scaleFactor, size.height * _scaleFactor);

Offset convertOldCoordinateToNew(Offset oldCoordinate) {
return oldCoordinate;
}

// Convenience method to wrap a widget with scaled dimensions
Widget scaleWidget({
required Widget child,
required Size originalSize,
}) {
Widget scaleWidget({required Widget child, required Size originalSize}) {
Size scaledSize = scaleSize(originalSize);
return SizedBox(
width: scaledSize.width,
Expand Down
2 changes: 1 addition & 1 deletion lib/const/folder_icons.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:icarus/const/custom_icons.dart';

const int folderIconRegistryVersion = 95;
const int folderIconRegistryVersion = 97;

enum FolderIconRenderKind {
material,
Expand Down
58 changes: 0 additions & 58 deletions lib/const/line_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@ import 'dart:ui';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hive_ce_flutter/adapters.dart';
import 'package:icarus/const/agents.dart';
import 'package:icarus/const/maps.dart';
import 'package:icarus/const/placed_classes.dart';
import 'package:icarus/const/settings.dart';
import 'package:icarus/providers/action_provider.dart';
import 'package:icarus/providers/map_provider.dart';
import 'package:icarus/providers/strategy_settings_provider.dart';
import 'package:json_annotation/json_annotation.dart';

part "line_provider.g.dart";
Expand Down Expand Up @@ -68,15 +65,6 @@ class LineUp extends HiveObject {
);
}

void switchSides({
required double agentSize,
required double abilitySize,
required double mapScale,
}) {
agent.switchSides(agentSize);
ability.switchSides(mapScale: mapScale, abilitySize: abilitySize);
}

factory LineUp.fromJson(Map<String, dynamic> json) => _$LineUpFromJson(json);

Map<String, dynamic> toJson() => _$LineUpToJson(this);
Expand Down Expand Up @@ -162,17 +150,6 @@ class LineUpGroup extends HiveObject {
);
}

void switchSides({
required double agentSize,
required double abilitySize,
required double mapScale,
}) {
agent.switchSides(agentSize);
for (final item in items) {
item.ability.switchSides(mapScale: mapScale, abilitySize: abilitySize);
}
}

factory LineUpGroup.fromJson(Map<String, dynamic> json) =>
_$LineUpGroupFromJson(json);

Expand Down Expand Up @@ -496,41 +473,6 @@ class LineUpProvider extends Notifier<LineUpState> {
setCurrentAbility(ability);
}

void switchSides() {
final agentSize = ref.read(strategySettingsProvider).agentSize;
final abilitySize = ref.read(strategySettingsProvider).abilitySize;
final currentMap = ref.read(mapProvider).currentMap;
final mapScale = Maps.mapScale[currentMap] ?? 1.0;
final groups = [...state.groups];

for (final group in groups) {
group.switchSides(
agentSize: agentSize,
abilitySize: abilitySize,
mapScale: mapScale,
);
}

for (final group in _poppedGroups) {
group.switchSides(
agentSize: agentSize,
abilitySize: abilitySize,
mapScale: mapScale,
);
}

final currentAgent = state.currentAgent;
final currentAbility = state.currentAbility;
currentAgent?.switchSides(agentSize);
currentAbility?.switchSides(mapScale: mapScale, abilitySize: abilitySize);

state = state.copyWith(
groups: groups,
currentAgent: currentAgent,
currentAbility: currentAbility,
);
}

void setSelectingPosition(bool isSelecting, {PlacingType? type}) {
state = state.copyWith(
isSelectingPosition: isSelecting,
Expand Down
Loading
Loading