feat: data sync integration test (#31)

Reviewed-on: twhelp/corev3#31
This commit is contained in:
Dawid Wysokiński 2024-01-10 06:39:09 +00:00
parent 819ee3dadd
commit 274f08d0cf
76 changed files with 147524 additions and 32 deletions

View File

@ -11,6 +11,11 @@ services:
environment:
POSTGRES_DB: twhelp
POSTGRES_PASSWORD: twhelp
rmq:
image: rabbitmq:3.12.10-alpine
environment:
RABBITMQ_DEFAULT_USER: twhelp
RABBITMQ_DEFAULT_PASS: twhelp
variables:
- &go_image 'golang:1.21'
@ -30,6 +35,8 @@ steps:
environment:
TESTS_POSTGRES_CONNECTION_STRING:
postgres://postgres:twhelp@database:5432/twhelp?sslmode=disable
TESTS_RABBITMQ_CONNECTION_STRING:
amqp://twhelp:twhelp@rmq:5672/
commands:
- go test -race -coverprofile=coverage.txt -covermode=atomic ./...

View File

@ -12,7 +12,7 @@ import (
"gitea.dwysokinski.me/twhelp/corev3/internal/health"
"gitea.dwysokinski.me/twhelp/corev3/internal/health/healthfile"
"gitea.dwysokinski.me/twhelp/corev3/internal/port"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill-amqp/v2/pkg/amqp"
"github.com/ThreeDotsLabs/watermill/message"

View File

@ -3,7 +3,7 @@ package main
import (
"log/slog"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill-amqp/v2/pkg/amqp"
"github.com/urfave/cli/v2"

View File

@ -5,7 +5,6 @@ import (
"io/fs"
"gitea.dwysokinski.me/twhelp/corev3/internal/adapter/internal/bunmodel"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"github.com/stretchr/testify/require"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dbfixture"
@ -35,18 +34,3 @@ func (f *Fixture) Load(tb TestingTB, ctx context.Context, fsys fs.FS, names ...s
tb.Helper()
require.NoError(tb, f.f.Load(ctx, fsys, names...))
}
func (f *Fixture) Server(tb TestingTB, id string) domain.Server {
tb.Helper()
row, err := f.f.Row("Server." + id)
require.NoError(tb, err)
s, ok := row.(*bunmodel.Server)
require.True(tb, ok)
converted, err := s.ToDomain()
require.NoError(tb, err)
return converted
}

View File

@ -48,13 +48,13 @@ func newPostgresConfig(opts ...PostgresOption) *postgresConfig {
return cfg
}
func WithTTL(ttlSeconds uint) PostgresOption {
func WithPostgresTTL(ttlSeconds uint) PostgresOption {
return func(cfg *postgresConfig) {
cfg.ttl = ttlSeconds
}
}
func WithImage(image string) PostgresOption {
func WithPostgresImage(image string) PostgresOption {
return func(cfg *postgresConfig) {
cfg.repo, cfg.tag = docker.ParseRepositoryTag(image)
}
@ -171,7 +171,7 @@ func (p *Postgres) NewBunDB(tb TestingTB) *bun.DB {
}
func (p *Postgres) Close() error {
if p.resource != nil {
if p != nil && p.resource != nil {
if err := p.resource.Close(); err != nil {
return err
}

View File

@ -5,7 +5,7 @@ import (
"fmt"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -5,7 +5,7 @@ import (
"fmt"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -5,7 +5,7 @@ import (
"fmt"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -5,7 +5,7 @@ import (
"fmt"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -5,7 +5,7 @@ import (
"fmt"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -81,6 +81,10 @@ func (a listTribeChangesParamsApplier) apply(q *bun.SelectQuery) *bun.SelectQuer
q = q.Order("tc.created_at ASC")
case domain.TribeChangeSortCreatedAtDESC:
q = q.Order("tc.created_at DESC")
case domain.TribeChangeSortIDASC:
q = q.Order("tc.id ASC")
case domain.TribeChangeSortIDDESC:
q = q.Order("tc.id DESC")
case domain.TribeChangeSortServerKeyASC:
q = q.Order("tc.server_key ASC")
case domain.TribeChangeSortServerKeyDESC:

View File

@ -205,6 +205,58 @@ func testTribeChangeRepository(t *testing.T, newRepos func(t *testing.T) reposit
assert.NotEmpty(t, total)
},
},
{
name: "OK: sort=[id ASC]",
params: func(t *testing.T) domain.ListTribeChangesParams {
t.Helper()
params := domain.NewListTribeChangesParams()
require.NoError(t, params.SetSort([]domain.TribeChangeSort{
domain.TribeChangeSortIDASC,
}))
return params
},
assertTribeChanges: func(t *testing.T, params domain.ListTribeChangesParams, tribeChanges domain.TribeChanges) {
t.Helper()
assert.NotEmpty(t, len(tribeChanges))
assert.True(t, slices.IsSortedFunc(tribeChanges, func(a, b domain.TribeChange) int {
return cmp.Compare(a.ID(), b.ID())
}))
},
assertError: func(t *testing.T, err error) {
t.Helper()
require.NoError(t, err)
},
assertTotal: func(t *testing.T, params domain.ListTribeChangesParams, total int) {
t.Helper()
assert.NotEmpty(t, total)
},
},
{
name: "OK: sort=[id DESC]",
params: func(t *testing.T) domain.ListTribeChangesParams {
t.Helper()
params := domain.NewListTribeChangesParams()
require.NoError(t, params.SetSort([]domain.TribeChangeSort{
domain.TribeChangeSortIDDESC,
}))
return params
},
assertTribeChanges: func(t *testing.T, params domain.ListTribeChangesParams, tribeChanges domain.TribeChanges) {
t.Helper()
assert.NotEmpty(t, len(tribeChanges))
assert.True(t, slices.IsSortedFunc(tribeChanges, func(a, b domain.TribeChange) int {
return cmp.Compare(a.ID(), b.ID()) * -1
}))
},
assertError: func(t *testing.T, err error) {
t.Helper()
require.NoError(t, err)
},
assertTotal: func(t *testing.T, params domain.ListTribeChangesParams, total int) {
t.Helper()
assert.NotEmpty(t, total)
},
},
{
name: fmt.Sprintf("OK: serverKeys=[%s]", randTribeChange.ServerKey()),
params: func(t *testing.T) domain.ListTribeChangesParams {

View File

@ -207,6 +207,8 @@ type TribeChangeSort uint8
const (
TribeChangeSortCreatedAtASC TribeChangeSort = iota + 1
TribeChangeSortCreatedAtDESC
TribeChangeSortIDASC
TribeChangeSortIDDESC
TribeChangeSortServerKeyASC
TribeChangeSortServerKeyDESC
)

View File

@ -3,7 +3,7 @@ package port
import (
"gitea.dwysokinski.me/twhelp/corev3/internal/app"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -3,7 +3,7 @@ package port
import (
"gitea.dwysokinski.me/twhelp/corev3/internal/app"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -3,7 +3,7 @@ package port
import (
"gitea.dwysokinski.me/twhelp/corev3/internal/app"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -3,7 +3,7 @@ package port
import (
"gitea.dwysokinski.me/twhelp/corev3/internal/app"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -3,7 +3,7 @@ package port
import (
"gitea.dwysokinski.me/twhelp/corev3/internal/app"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
)

View File

@ -0,0 +1,597 @@
package service_test
import (
"context"
"encoding/json"
"fmt"
"io"
"io/fs"
"net/http"
"net/http/httptest"
"net/url"
"os"
"os/signal"
"path"
"syscall"
"testing"
"time"
"gitea.dwysokinski.me/twhelp/corev3/internal/adapter"
"gitea.dwysokinski.me/twhelp/corev3/internal/app"
"gitea.dwysokinski.me/twhelp/corev3/internal/domain"
"gitea.dwysokinski.me/twhelp/corev3/internal/port"
"gitea.dwysokinski.me/twhelp/corev3/internal/tw"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillamqptest"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermilltest"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill-amqp/v2/pkg/amqp"
"github.com/brianvoe/gofakeit/v6"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// we can't run the subtests in parallel
//nolint:tparallel
func TestDataSync(t *testing.T) {
t.Parallel()
if testing.Short() {
t.Skip("skipping long-running test")
}
ctxTimeout, cancel := context.WithTimeout(context.Background(), 150*time.Second)
defer cancel()
ctx, stop := signal.NotifyContext(ctxTimeout, os.Interrupt, syscall.SIGTERM)
defer stop()
// bun
db := postgres.NewBunDB(t)
// watermill
marshaler := watermillmsg.JSONMarshaler{NewUUID: watermill.NewUUID}
generateExchangeAndRoutingKeyName := func(topic string) string {
return topic + "_sync_data"
}
rmqConn := rabbitMQ.NewConnection(t)
nopLogger := watermill.NopLogger{}
serverPub, serverSub := watermillamqptest.NewPubSub(
t,
rmqConn,
amqp.GenerateQueueNameTopicNameWithSuffix("_sync_data_server"),
generateExchangeAndRoutingKeyName,
)
playerPub, playerSub := watermillamqptest.NewPubSub(
t,
rmqConn,
amqp.GenerateQueueNameTopicNameWithSuffix("_sync_data_player"),
generateExchangeAndRoutingKeyName,
)
tribePub, tribeSub := watermillamqptest.NewPubSub(
t,
rmqConn,
amqp.GenerateQueueNameTopicNameWithSuffix("_sync_data_tribe"),
generateExchangeAndRoutingKeyName,
)
villagePub, villageSub := watermillamqptest.NewPubSub(
t,
rmqConn,
amqp.GenerateQueueNameTopicNameWithSuffix("_sync_data_village"),
generateExchangeAndRoutingKeyName,
)
// events/commands
serverCmdSync := gofakeit.UUID()
serverEventSynced := gofakeit.UUID()
playerEventSynced := gofakeit.UUID()
tribeEventSynced := gofakeit.UUID()
villageEventSynced := gofakeit.UUID()
// TW service
// filesys is set later in this test to os.DirFS("./testdata/syncdata/stage{n}")
var filesys fs.FS
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
u, err := url.Parse(r.URL.Query().Get("url"))
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
fname := u.Path + u.Query().Get("func")
f, err := filesys.Open(path.Join(u.Host, fname))
if err != nil {
f, err = filesys.Open(path.Join("default", fname))
}
if err != nil {
w.WriteHeader(http.StatusNotFound)
return
}
defer func() {
_ = f.Close()
}()
w.WriteHeader(http.StatusOK)
_, _ = io.Copy(w, f)
}))
t.Cleanup(srv.Close)
twSvc := adapter.NewTWHTTP(tw.NewClient(tw.WithHTTPClient(&http.Client{
Transport: &urlChangerTransport{
url: srv.URL,
transport: srv.Client().Transport,
},
})))
// adapters
versionRepo := adapter.NewVersionBunRepository(db)
serverRepo := adapter.NewServerBunRepository(db)
tribeRepo := adapter.NewTribeBunRepository(db)
playerRepo := adapter.NewPlayerBunRepository(db)
villageRepo := adapter.NewVillageBunRepository(db)
tribeChangeRepo := adapter.NewTribeChangeBunRepository(db)
serverPublisher := adapter.NewServerWatermillPublisher(serverPub, marshaler, serverCmdSync, serverEventSynced)
playerPublisher := adapter.NewPlayerWatermillPublisher(playerPub, marshaler, playerEventSynced)
tribePublisher := adapter.NewTribeWatermillPublisher(tribePub, marshaler, tribeEventSynced)
villagePublisher := adapter.NewVillageWatermillPublisher(villagePub, marshaler, villageEventSynced)
// services
versionSvc := app.NewVersionService(versionRepo)
serverSvc := app.NewServerService(serverRepo, twSvc, serverPublisher)
tribeChangeSvc := app.NewTribeChangeService(tribeChangeRepo)
tribeSvc := app.NewTribeService(tribeRepo, twSvc, tribePublisher)
playerSvc := app.NewPlayerService(playerRepo, tribeChangeSvc, twSvc, playerPublisher)
villageSvc := app.NewVillageService(villageRepo, twSvc, villagePublisher)
dataSyncSvc := app.NewDataSyncService(versionSvc, serverSvc, serverPublisher, nil)
watermilltest.RunRouterWithContext(
t,
ctx,
port.NewServerWatermillConsumer(
serverSvc,
serverSub,
nopLogger,
marshaler,
serverCmdSync,
serverEventSynced,
tribeEventSynced,
playerEventSynced,
villageEventSynced,
"",
),
port.NewTribeWatermillConsumer(tribeSvc, tribeSub, nopLogger, marshaler, serverEventSynced, villageEventSynced),
port.NewPlayerWatermillConsumer(playerSvc, playerSub, nopLogger, marshaler, serverEventSynced),
port.NewVillageWatermillConsumer(villageSvc, villageSub, nopLogger, marshaler, serverEventSynced),
)
for _, stage := range []uint{1, 2} {
stage := stage
t.Run(fmt.Sprintf("stage %d", stage), func(t *testing.T) {
filesys = os.DirFS(fmt.Sprintf("./testdata/syncdata/stage%d", stage))
require.NoError(t, dataSyncSvc.TriggerDataSync(ctx))
var expectedServers []map[string]any
readJSONFile(t, filesys, path.Join("expected", "servers.json"), &expectedServers)
assert.EventuallyWithTf(t, func(collect *assert.CollectT) {
require.NoError(collect, ctx.Err())
listParams := domain.NewListServersParams()
require.NoError(collect, listParams.SetSort([]domain.ServerSort{
domain.ServerSortKeyASC,
}))
require.NoError(collect, listParams.SetSpecial(domain.NullBool{
Value: false,
Valid: true,
}))
require.NoError(collect, listParams.SetLimit(domain.ServerListMaxLimit))
allServers := make(domain.Servers, 0, len(expectedServers))
for {
servers, err := serverRepo.List(ctx, listParams)
require.NoError(collect, err)
if len(servers) == 0 {
break
}
allServers = append(allServers, servers...)
require.NoError(collect, listParams.SetKeyGT(domain.NullString{
Value: servers[len(servers)-1].Key(),
Valid: true,
}))
}
if !assert.Len(collect, allServers, len(expectedServers)) {
return
}
for i, expected := range expectedServers {
actual := allServers[i]
msg := fmt.Sprintf("Key=%s", expected["Key"])
assert.Equal(collect, expected["Key"], actual.Key(), msg)
assert.Equal(collect, expected["URL"], actual.URL().String(), msg)
assert.Equal(collect, expected["Open"], actual.Open(), msg)
assert.Equal(collect, expected["VersionCode"], actual.VersionCode(), msg)
assert.EqualValues(collect, expected["NumPlayers"], actual.NumPlayers(), msg)
assert.EqualValues(collect, expected["NumTribes"], actual.NumTribes(), msg)
assert.EqualValues(collect, expected["NumVillages"], actual.NumVillages(), msg)
assert.EqualValues(collect, expected["NumPlayerVillages"], actual.NumPlayerVillages(), msg)
assert.EqualValues(collect, expected["NumBonusVillages"], actual.NumBonusVillages(), msg)
assert.EqualValues(
collect,
expected["NumBarbarianVillages"],
actual.NumBarbarianVillages(),
"Key=%s",
expected["Key"],
)
assert.WithinDuration(collect, time.Now(), actual.PlayerDataSyncedAt(), time.Minute, msg)
assert.WithinDuration(collect, time.Now(), actual.TribeDataSyncedAt(), time.Minute, msg)
assert.WithinDuration(collect, time.Now(), actual.VillageDataSyncedAt(), time.Minute, msg)
assert.JSONEqf(
collect,
string(marshalJSON(collect, expected["Config"])),
string(marshalJSON(collect, serverConfigToMap(actual.Config()))),
"Key=%s",
expected["Key"],
)
assert.JSONEq(
collect,
string(marshalJSON(collect, expected["BuildingInfo"])),
string(marshalJSON(collect, buildingInfoToMap(actual.BuildingInfo()))),
msg,
)
assert.JSONEq(
collect,
string(marshalJSON(collect, expected["UnitInfo"])),
string(marshalJSON(collect, unitInfoToMap(actual.UnitInfo()))),
msg,
)
}
}, 60*time.Second, time.Second, "servers")
var expectedTribes []map[string]any
readJSONFile(t, filesys, path.Join("expected", "tribes.json"), &expectedTribes)
assert.EventuallyWithT(t, func(collect *assert.CollectT) {
require.NoError(collect, ctx.Err())
listParams := domain.NewListTribesParams()
require.NoError(collect, listParams.SetSort([]domain.TribeSort{
domain.TribeSortServerKeyASC,
domain.TribeSortIDASC,
}))
require.NoError(collect, listParams.SetLimit(domain.TribeListMaxLimit))
allTribes := make(domain.Tribes, 0, len(expectedTribes))
for {
tribes, err := tribeRepo.List(ctx, listParams)
require.NoError(collect, err)
if len(tribes) == 0 {
break
}
allTribes = append(allTribes, tribes...)
require.NoError(collect, listParams.SetIDGT(domain.NullInt{
Value: tribes[len(tribes)-1].ID(),
Valid: true,
}))
}
if !assert.Len(collect, allTribes, len(expectedTribes)) {
return
}
for i, expected := range expectedTribes {
actual := allTribes[i]
msg := fmt.Sprintf("ID=%.0f,ServerKey=%s", expected["ID"], expected["ServerKey"])
assert.EqualValues(collect, expected["ID"], actual.ID(), msg)
assert.Equal(collect, expected["ServerKey"], actual.ServerKey(), msg)
assert.Equal(collect, expected["Name"], actual.Name(), msg)
assert.Equal(collect, expected["Tag"], actual.Tag(), msg)
assert.EqualValues(collect, expected["NumMembers"], actual.NumMembers(), msg)
assert.EqualValues(collect, expected["NumVillages"], actual.NumVillages(), msg)
assert.EqualValues(collect, expected["Points"], actual.Points(), msg)
assert.EqualValues(collect, expected["AllPoints"], actual.AllPoints(), msg)
assert.EqualValues(collect, expected["Rank"], actual.Rank(), msg)
assert.EqualValues(collect, expected["RankAtt"], actual.OD().RankAtt(), msg)
assert.EqualValues(collect, expected["ScoreAtt"], actual.OD().ScoreAtt(), msg)
assert.EqualValues(collect, expected["RankDef"], actual.OD().RankDef(), msg)
assert.EqualValues(collect, expected["ScoreDef"], actual.OD().ScoreDef(), msg)
assert.EqualValues(collect, expected["RankSup"], actual.OD().RankSup(), msg)
assert.EqualValues(collect, expected["ScoreSup"], actual.OD().ScoreSup(), msg)
assert.EqualValues(collect, expected["RankTotal"], actual.OD().RankTotal(), msg)
assert.EqualValues(collect, expected["ScoreTotal"], actual.OD().ScoreTotal(), msg)
assert.Equal(collect, expected["ProfileURL"], actual.ProfileURL().String(), msg)
assert.EqualValues(collect, expected["Dominance"], actual.Dominance(), msg)
assert.EqualValues(collect, expected["BestRank"], actual.BestRank(), msg)
assert.NotEmpty(collect, actual.BestRankAt(), msg)
assert.EqualValues(collect, expected["MostPoints"], actual.MostPoints(), msg)
assert.NotEmpty(collect, actual.MostPointsAt(), msg)
assert.EqualValues(collect, expected["MostVillages"], actual.MostVillages(), msg)
assert.NotEmpty(collect, actual.MostVillagesAt(), msg)
if deletedAt, ok := expected["DeletedAt"].(string); ok && (time.Time{}).Format(time.RFC3339) != deletedAt {
assert.NotEmpty(collect, actual.DeletedAt(), msg)
} else {
assert.Empty(collect, actual.DeletedAt(), msg)
}
}
}, 60*time.Second, time.Second, "tribes")
var expectedPlayers []map[string]any
readJSONFile(t, filesys, path.Join("expected", "players.json"), &expectedPlayers)
assert.EventuallyWithT(t, func(collect *assert.CollectT) {
require.NoError(collect, ctx.Err())
listParams := domain.NewListPlayersParams()
require.NoError(collect, listParams.SetSort([]domain.PlayerSort{
domain.PlayerSortServerKeyASC,
domain.PlayerSortIDASC,
}))
require.NoError(collect, listParams.SetLimit(domain.PlayerListMaxLimit))
allPlayers := make(domain.Players, 0, len(expectedPlayers))
for {
players, err := playerRepo.List(ctx, listParams)
require.NoError(collect, err)
if len(players) == 0 {
break
}
allPlayers = append(allPlayers, players...)
require.NoError(collect, listParams.SetIDGT(domain.NullInt{
Value: players[len(players)-1].ID(),
Valid: true,
}))
}
if !assert.Len(collect, allPlayers, len(expectedPlayers)) {
return
}
for i, expected := range expectedPlayers {
actual := allPlayers[i]
msg := fmt.Sprintf("ID=%.0f,ServerKey=%s", expected["ID"], expected["ServerKey"])
assert.EqualValues(collect, expected["ID"], actual.ID(), msg)
assert.Equal(collect, expected["ServerKey"], actual.ServerKey(), msg)
assert.Equal(collect, expected["Name"], actual.Name(), msg)
assert.EqualValues(collect, expected["NumVillages"], actual.NumVillages(), msg)
assert.EqualValues(collect, expected["Points"], actual.Points(), msg)
assert.EqualValues(collect, expected["Rank"], actual.Rank(), msg)
assert.EqualValues(collect, expected["TribeID"], actual.TribeID(), msg)
assert.EqualValues(collect, expected["RankAtt"], actual.OD().RankAtt(), msg)
assert.EqualValues(collect, expected["ScoreAtt"], actual.OD().ScoreAtt(), msg)
assert.EqualValues(collect, expected["RankDef"], actual.OD().RankDef(), msg)
assert.EqualValues(collect, expected["ScoreDef"], actual.OD().ScoreDef(), msg)
assert.EqualValues(collect, expected["RankSup"], actual.OD().RankSup(), msg)
assert.EqualValues(collect, expected["ScoreSup"], actual.OD().ScoreSup(), msg)
assert.EqualValues(collect, expected["RankTotal"], actual.OD().RankTotal(), msg)
assert.EqualValues(collect, expected["ScoreTotal"], actual.OD().ScoreTotal(), msg)
assert.Equal(collect, expected["ProfileURL"], actual.ProfileURL().String(), msg)
assert.EqualValues(collect, expected["BestRank"], actual.BestRank(), msg)
assert.NotEmpty(collect, actual.BestRankAt(), msg)
assert.EqualValues(collect, expected["MostPoints"], actual.MostPoints(), msg)
assert.NotEmpty(collect, actual.MostPointsAt(), msg)
assert.EqualValues(collect, expected["MostVillages"], actual.MostVillages(), msg)
assert.NotEmpty(collect, actual.MostVillagesAt(), msg)
if deletedAt, ok := expected["DeletedAt"].(string); ok && (time.Time{}).Format(time.RFC3339) != deletedAt {
assert.NotEmpty(collect, actual.DeletedAt(), msg)
} else {
assert.Empty(collect, actual.DeletedAt(), msg)
}
}
}, 60*time.Second, time.Second, "players")
var expectedVillages []map[string]any
readJSONFile(t, filesys, path.Join("expected", "villages.json"), &expectedVillages)
assert.EventuallyWithT(t, func(collect *assert.CollectT) {
require.NoError(collect, ctx.Err())
listParams := domain.NewListVillagesParams()
require.NoError(collect, listParams.SetSort([]domain.VillageSort{
domain.VillageSortServerKeyASC,
domain.VillageSortIDASC,
}))
require.NoError(collect, listParams.SetLimit(domain.VillageListMaxLimit))
allVillages := make(domain.Villages, 0, len(expectedVillages))
for {
villages, err := villageRepo.List(ctx, listParams)
require.NoError(collect, err)
if len(villages) == 0 {
break
}
allVillages = append(allVillages, villages...)
require.NoError(collect, listParams.SetIDGT(domain.NullInt{
Value: villages[len(villages)-1].ID(),
Valid: true,
}))
}
if !assert.Len(collect, allVillages, len(expectedVillages)) {
return
}
for i, expected := range expectedVillages {
actual := allVillages[i]
msg := fmt.Sprintf("ID=%.0f,ServerKey=%s", expected["ID"], expected["ServerKey"])
assert.EqualValues(collect, expected["ID"], actual.ID(), msg)
assert.Equal(collect, expected["ServerKey"], actual.ServerKey(), msg)
assert.Equal(collect, expected["Name"], actual.Name(), msg)
assert.EqualValues(collect, expected["Points"], actual.Points(), msg)
assert.EqualValues(collect, expected["X"], actual.X(), msg)
assert.EqualValues(collect, expected["Y"], actual.Y(), msg)
assert.Equal(collect, expected["Continent"], actual.Continent(), msg)
assert.EqualValues(collect, expected["Bonus"], actual.Bonus(), msg)
assert.EqualValues(collect, expected["PlayerID"], actual.PlayerID(), msg)
assert.Equal(collect, expected["ProfileURL"], actual.ProfileURL().String(), msg)
}
}, 60*time.Second, time.Second, "villages")
var expectedTribeChanges []map[string]any
readJSONFile(t, filesys, path.Join("expected", "tribe-changes.json"), &expectedTribeChanges)
assert.EventuallyWithT(t, func(collect *assert.CollectT) {
require.NoError(collect, ctx.Err())
listParams := domain.NewListTribeChangesParams()
require.NoError(collect, listParams.SetSort([]domain.TribeChangeSort{
domain.TribeChangeSortIDASC,
}))
require.NoError(collect, listParams.SetLimit(domain.TribeChangeListMaxLimit))
allTribeChanges := make(domain.TribeChanges, 0, len(expectedTribeChanges))
for {
tcs, err := tribeChangeRepo.List(ctx, listParams)
require.NoError(collect, err)
if len(tcs) == 0 {
break
}
allTribeChanges = append(allTribeChanges, tcs...)
require.NoError(collect, listParams.SetOffset(listParams.Offset()+domain.TribeChangeListMaxLimit))
}
if !assert.Len(collect, allTribeChanges, len(expectedTribeChanges)) {
return
}
for i, expected := range expectedTribeChanges {
actual := allTribeChanges[i]
msg := fmt.Sprintf("ID=%.0f,ServerKey=%s", expected["ID"], expected["ServerKey"])
assert.EqualValues(collect, expected["ID"], actual.ID(), msg)
assert.Equal(collect, expected["ServerKey"], actual.ServerKey(), msg)
assert.EqualValues(collect, expected["PlayerID"], actual.PlayerID(), msg)
assert.EqualValues(collect, expected["OldTribeID"], actual.OldTribeID(), msg)
assert.EqualValues(collect, expected["NewTribeID"], actual.NewTribeID(), msg)
}
}, 60*time.Second, time.Second, "tribe changes")
})
}
}
type urlChangerTransport struct {
url string
transport http.RoundTripper
}
func (t *urlChangerTransport) RoundTrip(r *http.Request) (*http.Response, error) {
u, err := url.Parse(t.url)
if err != nil {
return nil, err
}
u.RawQuery = url.Values{
"url": []string{r.URL.String()},
}.Encode()
r2 := r.Clone(r.Context())
r2.URL = u
return t.transport.RoundTrip(r2)
}
func readJSONFile(tb testing.TB, filesys fs.FS, name string, v any) {
tb.Helper()
f, err := filesys.Open(name)
require.NoError(tb, err)
defer func() {
_ = f.Close()
}()
require.NoError(tb, json.NewDecoder(f).Decode(v))
}
func serverConfigToMap(cfg domain.ServerConfig) map[string]any {
return map[string]any{
"Speed": cfg.Speed(),
"UnitSpeed": cfg.UnitSpeed(),
"Moral": cfg.Moral(),
"Build": cfg.Build(),
"Misc": cfg.Misc(),
"Commands": cfg.Commands(),
"Newbie": cfg.Newbie(),
"Game": cfg.Game(),
"Buildings": cfg.Buildings(),
"Snob": cfg.Snob(),
"Ally": cfg.Ally(),
"Coord": cfg.Coord(),
"Sitter": cfg.Sitter(),
"Sleep": cfg.Sleep(),
"Night": cfg.Night(),
"Win": cfg.Win(),
}
}
func unitInfoToMap(info domain.UnitInfo) map[string]any {
return map[string]any{
"Spear": info.Spear(),
"Sword": info.Sword(),
"Axe": info.Axe(),
"Archer": info.Archer(),
"Spy": info.Spy(),
"Light": info.Light(),
"Marcher": info.Marcher(),
"Heavy": info.Heavy(),
"Ram": info.Ram(),
"Catapult": info.Catapult(),
"Knight": info.Knight(),
"Snob": info.Snob(),
"Militia": info.Militia(),
}
}
func buildingInfoToMap(info domain.BuildingInfo) map[string]any {
return map[string]any{
"Main": info.Main(),
"Barracks": info.Barracks(),
"Stable": info.Stable(),
"Garage": info.Garage(),
"Watchtower": info.Watchtower(),
"Snob": info.Snob(),
"Smith": info.Smith(),
"Place": info.Place(),
"Statue": info.Statue(),
"Market": info.Market(),
"Wood": info.Wood(),
"Stone": info.Stone(),
"Iron": info.Iron(),
"Farm": info.Farm(),
"Storage": info.Storage(),
"Hide": info.Hide(),
"Wall": info.Wall(),
}
}
func marshalJSON(tb require.TestingT, v any) []byte {
if h, ok := tb.(interface {
Helper()
}); ok {
h.Helper()
}
b, err := json.Marshal(v)
require.NoError(tb, err)
return b
}

View File

@ -0,0 +1,56 @@
package service_test
import (
"flag"
"log"
"os"
"testing"
"gitea.dwysokinski.me/twhelp/corev3/internal/adapter/adaptertest"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillamqptest"
"github.com/ory/dockertest/v3"
)
var (
postgres *adaptertest.Postgres
rabbitMQ *watermillamqptest.RabbitMQ
)
func TestMain(m *testing.M) {
os.Exit(testMainWrapper(m))
}
func testMainWrapper(m *testing.M) int {
// https://github.com/golang/go/blob/7cfa7d69259590319524c3715df4a39b39924bc3/src/testing/testing.go#L224
flag.Parse()
if testing.Short() {
return m.Run()
}
pool, err := dockertest.NewPool("")
if err != nil {
log.Println("couldn't construct dockertest.Pool:", err)
return 1
}
postgres, err = adaptertest.NewPostgres(pool, adaptertest.WithPostgresTTL(180))
if err != nil {
log.Println("couldn't construct adaptertest.Postgres:", err)
return 1
}
defer func() {
_ = postgres.Close()
}()
rabbitMQ, err = watermillamqptest.NewRabbitMQ(pool, watermillamqptest.WithRabbitMQTTL(180))
if err != nil {
log.Println("couldn't construct watermillamqptest.RabbitMQ:", err)
return 1
}
defer func() {
_ = rabbitMQ.Close()
}()
return m.Run()
}

View File

@ -0,0 +1 @@
a:0:{}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,227 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<config>
<main>
<max_level>30</max_level>
<min_level>1</min_level>
<wood>90</wood>
<stone>80</stone>
<iron>70</iron>
<pop>5</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>900</build_time>
<build_time_factor>1.2</build_time_factor>
</main>
<barracks>
<max_level>25</max_level>
<min_level>0</min_level>
<wood>200</wood>
<stone>170</stone>
<iron>90</iron>
<pop>7</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.28</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>1800</build_time>
<build_time_factor>1.2</build_time_factor>
</barracks>
<stable>
<max_level>20</max_level>
<min_level>0</min_level>
<wood>270</wood>
<stone>240</stone>
<iron>260</iron>
<pop>8</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.28</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>6000</build_time>
<build_time_factor>1.2</build_time_factor>
</stable>
<garage>
<max_level>15</max_level>
<min_level>0</min_level>
<wood>300</wood>
<stone>240</stone>
<iron>260</iron>
<pop>8</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.28</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>6000</build_time>
<build_time_factor>1.2</build_time_factor>
</garage>
<snob>
<max_level>1</max_level>
<min_level>0</min_level>
<wood>15000</wood>
<stone>25000</stone>
<iron>10000</iron>
<pop>80</pop>
<wood_factor>2</wood_factor>
<stone_factor>2</stone_factor>
<iron_factor>2</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>586800</build_time>
<build_time_factor>1.2</build_time_factor>
</snob>
<smith>
<max_level>20</max_level>
<min_level>0</min_level>
<wood>220</wood>
<stone>180</stone>
<iron>240</iron>
<pop>20</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>6000</build_time>
<build_time_factor>1.2</build_time_factor>
</smith>
<place>
<max_level>1</max_level>
<min_level>0</min_level>
<wood>10</wood>
<stone>40</stone>
<iron>30</iron>
<pop>0</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>10860</build_time>
<build_time_factor>1.2</build_time_factor>
</place>
<statue>
<max_level>1</max_level>
<min_level>0</min_level>
<wood>220</wood>
<stone>220</stone>
<iron>220</iron>
<pop>10</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>1500</build_time>
<build_time_factor>1.2</build_time_factor>
</statue>
<market>
<max_level>25</max_level>
<min_level>0</min_level>
<wood>100</wood>
<stone>100</stone>
<iron>100</iron>
<pop>20</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>2700</build_time>
<build_time_factor>1.2</build_time_factor>
</market>
<wood>
<max_level>30</max_level>
<min_level>0</min_level>
<wood>50</wood>
<stone>60</stone>
<iron>40</iron>
<pop>5</pop>
<wood_factor>1.25</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.245</iron_factor>
<pop_factor>1.155</pop_factor>
<build_time>900</build_time>
<build_time_factor>1.2</build_time_factor>
</wood>
<stone>
<max_level>30</max_level>
<min_level>0</min_level>
<wood>65</wood>
<stone>50</stone>
<iron>40</iron>
<pop>10</pop>
<wood_factor>1.27</wood_factor>
<stone_factor>1.265</stone_factor>
<iron_factor>1.24</iron_factor>
<pop_factor>1.14</pop_factor>
<build_time>900</build_time>
<build_time_factor>1.2</build_time_factor>
</stone>
<iron>
<max_level>30</max_level>
<min_level>0</min_level>
<wood>75</wood>
<stone>65</stone>
<iron>70</iron>
<pop>10</pop>
<wood_factor>1.252</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.24</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>1080</build_time>
<build_time_factor>1.2</build_time_factor>
</iron>
<farm>
<max_level>30</max_level>
<min_level>1</min_level>
<wood>45</wood>
<stone>40</stone>
<iron>30</iron>
<pop>0</pop>
<wood_factor>1.3</wood_factor>
<stone_factor>1.32</stone_factor>
<iron_factor>1.29</iron_factor>
<pop_factor>1</pop_factor>
<build_time>1200</build_time>
<build_time_factor>1.2</build_time_factor>
</farm>
<storage>
<max_level>30</max_level>
<min_level>1</min_level>
<wood>60</wood>
<stone>50</stone>
<iron>40</iron>
<pop>0</pop>
<wood_factor>1.265</wood_factor>
<stone_factor>1.27</stone_factor>
<iron_factor>1.245</iron_factor>
<pop_factor>1.15</pop_factor>
<build_time>1020</build_time>
<build_time_factor>1.2</build_time_factor>
</storage>
<hide>
<max_level>10</max_level>
<min_level>0</min_level>
<wood>50</wood>
<stone>60</stone>
<iron>50</iron>
<pop>2</pop>
<wood_factor>1.25</wood_factor>
<stone_factor>1.25</stone_factor>
<iron_factor>1.25</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>1800</build_time>
<build_time_factor>1.2</build_time_factor>
</hide>
<wall>
<max_level>20</max_level>
<min_level>0</min_level>
<wood>50</wood>
<stone>100</stone>
<iron>20</iron>
<pop>5</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>3600</build_time>
<build_time_factor>1.2</build_time_factor>
</wall>
</config>

View File

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<config>
<speed>1</speed>
<unit_speed>1</unit_speed>
<moral>1</moral>
<build>
<destroy>1</destroy>
</build>
<misc>
<kill_ranking>2</kill_ranking>
<tutorial>5</tutorial>
<trade_cancel_time>300</trade_cancel_time>
</misc>
<commands>
<millis_arrival>1</millis_arrival>
<command_cancel_time>600</command_cancel_time>
</commands>
<newbie>
<days>7</days>
<ratio_days>60</ratio_days>
<ratio>20</ratio>
<removeNewbieVillages>1</removeNewbieVillages>
</newbie>
<game>
<buildtime_formula>2</buildtime_formula>
<knight>3</knight>
<knight_new_items></knight_new_items>
<archer>1</archer>
<tech>2</tech>
<farm_limit>0</farm_limit>
<church>0</church>
<watchtower>0</watchtower>
<stronghold>1</stronghold>
<fake_limit>1</fake_limit>
<barbarian_rise>0.003</barbarian_rise>
<barbarian_shrink>1</barbarian_shrink>
<barbarian_max_points>2000</barbarian_max_points>
<scavenging>1</scavenging>
<hauls>1</hauls>
<hauls_base>1000</hauls_base>
<hauls_max>100000</hauls_max>
<base_production>30</base_production>
<event>10</event>
<suppress_events>0</suppress_events>
</game>
<buildings>
<custom_main>-1</custom_main>
<custom_farm>-1</custom_farm>
<custom_storage>-1</custom_storage>
<custom_place>-1</custom_place>
<custom_barracks>-1</custom_barracks>
<custom_church>-1</custom_church>
<custom_smith>-1</custom_smith>
<custom_wood>-1</custom_wood>
<custom_stone>-1</custom_stone>
<custom_iron>-1</custom_iron>
<custom_market>-1</custom_market>
<custom_stable>-1</custom_stable>
<custom_wall>-1</custom_wall>
<custom_garage>-1</custom_garage>
<custom_hide>-1</custom_hide>
<custom_snob>-1</custom_snob>
<custom_statue>-1</custom_statue>
<custom_watchtower>-1</custom_watchtower>
</buildings>
<snob>
<gold>1</gold>
<cheap_rebuild>0</cheap_rebuild>
<rise>2</rise>
<max_dist>1000</max_dist>
<factor>0.9</factor>
<coin_wood>28000</coin_wood>
<coin_stone>30000</coin_stone>
<coin_iron>25000</coin_iron>
<no_barb_conquer></no_barb_conquer>
</snob>
<ally>
<no_harm>0</no_harm>
<no_other_support>1</no_other_support>
<no_other_support_type>0</no_other_support_type>
<allytime_support>0</allytime_support>
<no_leave>0</no_leave>
<no_join>0</no_join>
<limit>50</limit>
<fixed_allies>0</fixed_allies>
<wars_member_requirement>5</wars_member_requirement>
<wars_points_requirement>15000</wars_points_requirement>
<wars_autoaccept_days>7</wars_autoaccept_days>
<levels>1</levels>
<xp_requirements>v1</xp_requirements>
</ally>
<coord>
<map_size>1000</map_size>
<func>4</func>
<empty_villages>70</empty_villages>
<bonus_villages>10</bonus_villages>
<inner>8287</inner>
<select_start>1</select_start>
<village_move_wait>336</village_move_wait>
<noble_restart>1</noble_restart>
<start_villages>1</start_villages>
</coord>
<sitter>
<allow>1</allow>
</sitter>
<sleep>
<active>0</active>
<delay>60</delay>
<min>6</min>
<max>10</max>
<min_awake>12</min_awake>
<max_awake>36</max_awake>
<warn_time>10</warn_time>
</sleep>
<night>
<active>1</active>
<start_hour>23</start_hour>
<end_hour>8</end_hour>
<def_factor>2</def_factor>
<duration>14</duration>
</night>
<win>
<check>5</check>
</win>
</config>

View File

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<config>
<spear>
<build_time>1020</build_time>
<pop>1</pop>
<speed>18</speed>
<attack>10</attack>
<defense>15</defense>
<defense_cavalry>45</defense_cavalry>
<defense_archer>20</defense_archer>
<carry>25</carry>
</spear>
<sword>
<build_time>1500</build_time>
<pop>1</pop>
<speed>22</speed>
<attack>25</attack>
<defense>50</defense>
<defense_cavalry>15</defense_cavalry>
<defense_archer>40</defense_archer>
<carry>15</carry>
</sword>
<axe>
<build_time>1320</build_time>
<pop>1</pop>
<speed>18</speed>
<attack>40</attack>
<defense>10</defense>
<defense_cavalry>5</defense_cavalry>
<defense_archer>10</defense_archer>
<carry>10</carry>
</axe>
<archer>
<build_time>1800</build_time>
<pop>1</pop>
<speed>18</speed>
<attack>15</attack>
<defense>50</defense>
<defense_cavalry>40</defense_cavalry>
<defense_archer>5</defense_archer>
<carry>10</carry>
</archer>
<spy>
<build_time>900</build_time>
<pop>2</pop>
<speed>9</speed>
<attack>0</attack>
<defense>2</defense>
<defense_cavalry>1</defense_cavalry>
<defense_archer>2</defense_archer>
<carry>0</carry>
</spy>
<light>
<build_time>1800</build_time>
<pop>4</pop>
<speed>10</speed>
<attack>130</attack>
<defense>30</defense>
<defense_cavalry>40</defense_cavalry>
<defense_archer>30</defense_archer>
<carry>80</carry>
</light>
<marcher>
<build_time>2700</build_time>
<pop>5</pop>
<speed>10</speed>
<attack>120</attack>
<defense>40</defense>
<defense_cavalry>30</defense_cavalry>
<defense_archer>50</defense_archer>
<carry>50</carry>
</marcher>
<heavy>
<build_time>3600</build_time>
<pop>6</pop>
<speed>11</speed>
<attack>150</attack>
<defense>200</defense>
<defense_cavalry>80</defense_cavalry>
<defense_archer>180</defense_archer>
<carry>50</carry>
</heavy>
<ram>
<build_time>4800</build_time>
<pop>5</pop>
<speed>30</speed>
<attack>2</attack>
<defense>20</defense>
<defense_cavalry>50</defense_cavalry>
<defense_archer>20</defense_archer>
<carry>0</carry>
</ram>
<catapult>
<build_time>7200</build_time>
<pop>8</pop>
<speed>30</speed>
<attack>100</attack>
<defense>100</defense>
<defense_cavalry>50</defense_cavalry>
<defense_archer>100</defense_archer>
<carry>0</carry>
</catapult>
<knight>
<build_time>21600</build_time>
<pop>10</pop>
<speed>10</speed>
<attack>150</attack>
<defense>250</defense>
<defense_cavalry>400</defense_cavalry>
<defense_archer>150</defense_archer>
<carry>100</carry>
</knight>
<snob>
<build_time>18000</build_time>
<pop>100</pop>
<speed>35</speed>
<attack>30</attack>
<defense>100</defense>
<defense_cavalry>50</defense_cavalry>
<defense_archer>100</defense_archer>
<carry>0</carry>
</snob>
<militia>
<build_time>1</build_time>
<pop>0</pop>
<speed>0.016666666666667</speed>
<attack>0</attack>
<defense>15</defense>
<defense_cavalry>45</defense_cavalry>
<defense_archer>25</defense_archer>
<carry>0</carry>
</militia>
</config>

View File

@ -0,0 +1,283 @@
1,Konfederacja,CSA-X,49,9610,79734535,84293901,1
4,Farmerzy,Farma,1,2,9523,9523,127
7,Spoceni+Kuzyni,KUZYNI,41,4745,39443045,39443116,4
8,W+O+W,WOW,10,10,26037,26037,90
12,AveMy,AveMy,2,1,5995,5995,146
13,FarmerzyPremium,P.P,1,1,454,454,216
19,Wojna+Domowa+Centrum,%2AWDC%2A,2,1,129,129,241
24,Anonymous,IT,17,21,69149,69149,63
29,Elitarne+plemie+zbieraczy+PP,EPZPP,50,122,481916,484598,32
31,Project+D,PD,20,28,71157,71157,62
33,Towarzystwo+Wzajemnej+Asekuracji,TWA,25,61,243847,243847,44
35,MotoMyszy.,MzM,48,4085,35223609,35837645,6
39,OZDR+%2B+Why,Ozdr%40,28,374,2661501,2661501,15
47,Konfederacja+Z,CSA-Z,48,9539,77167049,81825499,2
53,Zakon+Zielonego+Li%C5%9Bcia,420,1,13,49609,49609,71
56,Pot%C4%99%C5%BCne+Pelikany,%2APP%2A,1,1,678,678,207
59,Znani+i+Nieznani,ZiN,9,8,17154,17154,109
68,Obro%C5%84cy+Cadii,Cadia,20,105,496548,496548,31
71,why+so+serious,Why%3F,26,1144,9778999,9778999,10
72,Dinozaury,DINO,3,4,15813,15813,111
77,Wyznawcy+Darksizmu,-WzDa-,5,5,3811,3811,164
80,Legion,-LM-,13,31,162947,162947,49
85,Motomyszy,MzM.,50,4613,38916809,40754476,5
89,FRIENDOLINOS,OG,2,0,168,168,237
92,MotoMyszy%21,MzM%21,1,1,3421,3421,167
96,Zakon+Czerwonej+R%C3%B3%C5%BCy,Z.C.R,12,13,19201,19201,102
97,FARMERZY+PLEMION,FARME,1,6,23474,23474,95
106,GWIEZDNA+FEDERACJA,GF,24,342,1896632,1896632,16
112,co%C5%9B+wi%C4%99cej,CW,4,3,1122,1122,196
115,zgierzanie,zgr,1,7,45603,45603,76
116,PotrzymajMiBrowar,PMB,1,1,1598,1598,187
117,Przybysze+z+kosmosu,Pzk,5,5,19683,19683,101
120,Orkowi+Zawodnicy+Dominuj%C4%85+Rybki,OZDR,49,5550,46956015,48360507,3
125,Szcz%C4%99%C5%9Bliwi+Gracze,SG,4,6,33298,33298,85
129,PREM,Punkty,5,19,24356,24356,93
134,DarNocy,DN,1,5,31077,31077,87
147,Bandycka+Elita+Niskoros%C5%82ych,BENIS,1,0,0,0,260
157,Domino,Dom,35,181,916826,916826,25
159,Oggr,Ogg,1,0,524,524,214
176,Albanski+Raj,AR,2,6,42024,42024,78
185,NISZCZYCIELE,%7CN%7C,1,0,0,0,261
187,Champions+League,-ChL-,1,0,347,347,220
194,Vis+Maior,VS,17,150,820208,820208,26
200,Takie+tam,Ttm.,1,0,531,531,213
206,Pppp,P..p,1,0,551,551,211
210,NoPon,N-P,47,68,204493,205215,47
211,%2APotrzymaj+mi+Piwo,%2APmP,2,5,18106,18106,106
214,Armia+Bosmana,BOSMAN,3,3,4230,4230,159
216,Plemie+Igora,P.L.I,1,0,0,0,262
220,Amatorzy+Kiszonych+Og%C3%B3rk%C3%B3w,ALKO,3,3,2264,2264,179
234,Pepeki123,pepek,24,27,81264,81264,57
236,Nakr%C4%99cane+Myszy,NM,1,0,262,262,226
255,-QED-,QED,1,3,22893,22893,96
256,GET+this+osada,GETTO,1,1,2552,2552,174
260,B%C5%82%C4%99kitna+Planeta,%2ABP%2A,1,0,5708,5708,149
281,Liga+Mistrzow,LM,1,3,5950,5950,147
285,Kompletnie+Bezsensowne+Plemi%C4%99+xD,KBS,17,51,211326,211326,46
287,fififi,fi,1,3,10461,10461,123
290,Komercja+Plemionn,K+-+P,1,0,197,197,233
291,MotoMyszy%3F,.Mzm.,47,2593,19704268,20286906,8
301,Psycho+szczury,MzM..,37,1866,14094868,14094868,9
305,Pro+Sto,Pro,1,1,7425,7425,136
309,Konfederacja+Y,CSA-Y,18,1088,9174264,9174264,11
317,Szalone+Nied%C5%BAwiedzie,Mi%C5%9Bki,1,0,4609,4609,157
319,PAKT,PAKT,2,2,6188,6188,145
336,hkgj,kw,1,0,0,0,263
339,ZARZEW,ZRW,1,0,2775,2775,170
355,uuuuuuuuuuuuuuu,uuu,1,0,3988,3988,160
365,GIE%C5%81DA,GA,1,0,8318,8318,131
369,0rkowi+Zawodnicy+Dominuj%C4%85+Rybki,0ZDR,36,3043,26198197,26198197,7
373,Gildia+Kupiecka,GK,2,3,13805,13805,115
374,xyz.,xyz.,1,0,901,901,199
375,PePeKi+PP.PP,PKTPP,18,16,38947,38947,80
377,AKADEMIA+WD,AWD,24,26,56124,56124,68
382,HANDEL,HANDEL,1,1,2203,2203,180
385,Bia%C5%82a+Armia,B.A,5,17,80171,80171,58
397,Emka,E.M.,1,1,1170,1170,194
412,BOMBA,BOMBA,22,107,396978,396978,35
413,Giht,Hggf,1,1,1374,1374,189
415,.%3Axxx%3A.,xxxx,1,0,26,26,249
429,Zabi+Staw,Z-S,1,0,812,812,200
430,%2A%2AWojna+Idei%2A%2A,%2A%2AWD%2A%2A,1,0,0,0,264
432,McOpole,McOpo,21,210,1249639,1249639,21
435,ave+sieci,sieci,1,1,4441,4441,158
441,Project+D%21,PD%21,23,43,96866,96866,55
443,PEAKY+BLINDERS,PB,1,0,0,0,265
451,AVE+%28M%29,AVE%28M%29,1,0,169,169,236
452,Obro%C5%84cy+Krasnali+Ogroduwych,OKO,47,108,386827,388034,36
474,zagubiony+natanek,wul,1,0,536,536,212
475,Zbieracze+Punktow+Premium,Z%2AP%2AP,2,2,9300,9300,129
503,TMPL,TMP,1,1,2332,2332,178
517,M%C3%B3j+Dom,%3D+MD+%3D,2,1,1174,1174,193
520,ESSA,ESSA,2,6,25153,25153,92
523,Wiocha,Yuby,1,0,261,261,227
546,WOJNA+IDEI,WD,1,1,50,50,248
548,Co+Chcesz%3F,CO,1,1,317,317,223
554,%3Dpremium%3D,pp.,3,2,4768,4768,155
557,WYROLOWANI,WYROL,1,5,39506,39506,79
594,T+E+R+Y+T+O+R+I+U+M,%5DT%5B,4,4,13494,13494,117
597,Bractwo+Krzy%C5%BCowe,%2BBK%2B,2,1,7686,7686,134
607,NAJEMNICY.,N%2FM%2FY,5,22,95363,95363,56
624,K35+DEMONY,K35,1,3,19050,19050,103
625,Wilki,Wilki,1,0,808,808,201
626,Targowica,Targ,1,3,11099,11099,121
633,Wolny,WS,1,16,80047,80047,59
636,Superpremium,%28%24%29,5,5,5381,5381,151
647,Ow%C5%82osione+Rogale,OwR,7,11,36369,36369,82
651,Semper+Invicta,Sempe,3,4,11832,11832,120
664,Kal-Kol,K+L+N,3,2,7328,7328,138
666,KOM0RNICY+2,KOM2,27,504,3631190,3631190,13
686,Semper+Invicta.,Semp.,3,2,3169,3169,169
689,Ga%C5%9Bnice+Po%C5%BCarowe+Stra%C5%BCaka,GPS%21,1,0,126,126,243
693,Why+So+Serious%3F,Why,1,0,0,0,266
722,Bractwo+Nocnych+Polan,BNP,30,196,1067408,1067408,22
723,Raki+nie+boraki,Rnb,1,1,2750,2750,171
733,Kuzyni+2,KUZYNA,1,1,26,26,250
750,Moje+OHV,OHV,1,0,249,249,228
758,-300-,-300-,5,6,13695,13695,116
766,%2AAnonymous%2A,%2AAMS%2A,1,0,0,0,267
778,Imperium+Polskie,IP,12,12,30040,30040,88
785,KOMORNICY3,KOM3,38,737,5057759,5057759,12
786,JP2+2137,21%3A37,7,48,257077,257077,42
806,Cesarstwo+Zachodnio+Rzymskie,SPQR,1,0,26,26,251
809,NOC3,NOC3,1,0,343,343,221
822,%2AGramy+Dla+Zabawy%2A%2A,%2AGDZ%2A%2A,2,10,42120,42120,77
830,Komornicy,KOM1,3,13,73615,73615,61
841,PP+Pan+Dziobak,PEPE,1,1,771,771,203
847,Nowa+nadzieja,Nowa,35,119,351739,351739,39
862,IMPERIUM+%2B,.%3A%2B%3A.,31,287,1774471,1774471,17
936,Gracz+bula9001+zablokowa%C5%82+ci%C4%99.,bula90,1,8,77623,77623,60
944,YOGI,YOGI,7,14,60284,60284,66
945,Brygada+RR,RR,1,0,689,689,206
963,Grupa+Amerykanka,GAZ,2,2,2349,2349,176
965,Kamilanie+Gora,KG,1,0,1827,1827,182
989,KOMORNICYX,KOMX,2,1,9905,9905,125
991,Ordo+Theutonicorum,OT,1,0,0,0,268
1023,AWANGARDA,.%29A%28.,4,15,55248,55248,69
1039,IMPERIUM+%2B%2B,%3A%2B%3A,11,107,563999,563999,30
1040,We+Are+Ready%21,WAR%21,2,3,18048,18048,107
1052,Gachi+Frens,-%3DGF%3D-,11,29,139074,139074,51
1058,Powa%C5%BCneUgrupowanieBy%C5%82ychGraczy,PUBG,1,1,10021,10021,124
1079,Rycerze+Czerwonego+Tartanu,RCT,6,56,369388,369388,37
1096,DNR+F,ACHTUN,4,7,38811,38811,81
1108,K0MORNICY4,KOM4,13,68,329883,329883,40
1127,BLOCKCHAIN,CRYPTO,1,8,49418,49418,72
1128,Nazwa+b%C4%99dzie+wkr%C3%B3tce,NBW,16,81,416408,416408,33
1140,0.7+zg%C5%82o%C5%9B+si%C4%99,POLEJ,8,135,1011133,1011133,24
1148,HELLGATE,%2AHG%2A,9,61,234026,234026,45
1161,Ose%C5%82ka,OS.,1,2,13377,13377,118
1163,Kl8F,Klasa8,2,2,12630,12630,119
1166,Dybuk,Dybuk,1,3,18993,18993,104
1170,Nono,Nnn,1,0,0,0,269
1209,Komandosi+na+5,KOM5,2,5,20529,20529,100
1226,Cartel+TW,Cartel,40,476,3200975,3200975,14
1232,Braty+i+Kompany,BiK,4,4,1235,1235,192
1247,%C5%BCydek+natanek,qwq,1,0,243,243,229
1258,Bum%21,Bum%21,1,0,128,128,242
1261,Ujazdowcy,UJ,1,2,6741,6741,143
1275,CSA-ATAK,CSA-AT,1,0,26,26,252
1278,Waffen-SS,W-SS,1,3,7062,7062,141
1293,youll+never+walk+alone,ynwa,11,50,301640,301640,41
1312,Purpurowi+Zegarmistrze+%C5%9Awiat%C5%82a,ZEGARY,45,186,701653,703439,28
1317,1edc,1edc,1,0,26,26,253
1333,Grupa+Wsparcia+Amator%C3%B3w,GWA,1,0,764,764,204
1336,Scandi+Power,SCP,21,266,1514988,1514988,18
1338,weee,wg,1,0,0,0,270
1347,BezCov,B-C,3,2,7308,7308,139
1357,J.+B.+B....,JBB%3B%2F,1,0,0,0,271
1368,Elitarny+Legion,ELITA,2,18,68427,68427,64
1372,WIDMO,WIDMO,1,0,0,0,272
1376,Wojna+Idei+P,WDP,1,1,628,628,209
1389,dfbdfbd,db,1,0,4663,4663,156
1399,Bojk%C3%B3w,_B_,3,6,36070,36070,83
1411,HURAGAN,Tajfun,28,257,1405083,1405083,20
1416,Z%C5%82odzieje+Przysz%C5%82o%C5%9Bci,%3DZP%3D,1,1,1857,1857,181
1418,Plemi%C4%99+Rodu+Smoka,PRS,3,22,172971,172971,48
1421,Dla+fanu+pykamy,DFP,1,0,1643,1643,184
1423,Grupa+Armii+%C5%9Arodek,%C5%9Arodek,2,11,52309,52309,70
1428,Wodne+zwierzaczki,WZ,1,3,17761,17761,108
1431,Amanita+Muscaria,A-M,3,2,1511,1511,188
1432,Nasze+Plemie,ABW,1,1,1627,1627,185
1448,myself,%3DMf%3D,1,0,0,0,273
1456,1-2-0,1x2,2,2,10863,10863,122
1460,bobertos,ZIOM,2,1,200,200,232
1466,GREEN+STREET+HOOLIGANS,GSH,7,20,112014,112014,54
1470,SunnyValley,SV,1,6,45642,45642,75
1477,Do+ko%C5%84ca%21,DK%21,1,1,307,307,224
1480,KUZYN+X,KUZYN%3F,14,284,1482901,1482901,19
1483,Afrika+Korps,AK,1,0,0,0,274
1484,INVISIBLE,IV,1,0,26,26,254
1494,Wioska+Matrix9105%40,Matrix,1,0,0,0,275
1498,Kokoko,KKK7,1,0,2745,2745,172
1523,Ty+i+Twoje+orzeszki,T.T,26,115,649837,649837,29
1526,Polanie,Polani,1,0,0,0,276
1528,NieZniszczalni.,NZ,3,3,2617,2617,173
1530,S%C5%81OWIANIE,S%C5%81OWO,3,3,6388,6388,144
1535,The+Gorillas,GOR,2,26,142006,142006,50
1538,Ho+no+tu,SOO,1,2,7382,7382,137
1551,Siewca+Wiatru,%7ESW%7E,7,14,48043,48043,74
1573,DUCHY,DUCH,11,10,9505,9505,128
1582,Ca%C5%82e+%C5%BBycie+z+Wariatami,WARIAT,1,1,7987,7987,133
1585,SAM+WE+M%C5%81YNIE,SWM,1,0,722,722,205
1588,Moment+Strategiczny,no+c%C3%B3%C5%BC,1,12,59739,59739,67
1590,Bo+od+tylu+tez+jest+fajnie,Xes,5,5,3318,3318,168
1597,Kontra,Kontra,42,178,791549,799441,27
1599,ma%C5%82e+ciche+do+g%C4%99siej+szyji,mcgs,1,0,358,358,219
1602,Uuuu,Uuy,1,1,3854,3854,163
1609,asdd,das,1,0,0,0,277
1610,Kombinat+Punkkt%C3%B3w+Premium,KPP,1,0,138,138,240
1621,Rolnicy+Podlasie,RP,11,186,1018468,1018468,23
1626,JazdaZKuramk,JZK,1,0,0,0,278
1627,ANONYMOUSS,ANS,15,43,112530,112530,53
1636,GDZIE+S%C4%84+%3F%3F%3F,MA%C5%81YSZ,1,1,3622,3622,165
1638,asyy,asyy,1,0,26,26,255
1643,1112,12,1,0,0,0,279
1645,Rekontakt,REK,2,3,8317,8317,132
1648,Aldente,Ald,1,1,338,338,222
1651,Oszukani,New,2,1,3936,3936,161
1652,%C5%81omocimy,Zaj%C4%99nc,1,7,15823,15823,110
1656,Robotniczy+Klub+Sportowy+HUWDU,HUWDU,1,1,270,270,225
1657,Xyz%2C,Xyz%2C,1,0,498,498,215
1669,Mocny+FULL,FULL,5,8,18721,18721,105
1672,MKM.,MKM.,1,2,9572,9572,126
1680,Mymu,My,2,4,27342,27342,89
1681,fehg,wwerj,1,0,0,0,280
1683,......,FIN,1,9,49097,49097,73
1687,SoSKooperacja,SoS,7,7,14738,14738,114
1690,Nie%C5%9Bmiertelni,ookp,1,1,2343,2343,177
1691,Zbieram+flagi,Zbf,1,4,7264,7264,140
1692,Zapraszam+ch%C4%99tnych,Buuu,1,1,5178,5178,152
1700,Fiku+Miku,FIUFIU,4,70,367550,367550,38
1705,Galaktyczna+Federacja+%C5%9Awiat%C5%82a,GF+II,1,1,1609,1609,186
1707,Koniec,1234,1,1,26,26,256
1715,R-C-,RC,1,2,5005,5005,153
1716,KOMORNIKI,KOMY,2,4,34258,34258,84
1721,Pocahontas,Gg,1,2,5823,5823,148
1724,Punkty+Premium+i+Flagi,Witamy,37,64,251898,251898,43
1727,Lykanie,LK,1,0,0,0,281
1728,fffff,fffff,1,1,3440,3440,166
1729,Gallowo,GAL,1,7,14794,14794,113
1734,Woir,Wrrrr,1,1,5703,5703,150
1735,Strong+Ekipa,SE,31,114,404065,404065,34
1737,Samiec+Alfa,Alfa,1,0,0,0,282
1740,T.W.,%3DTW%3D,1,19,122227,122227,52
1745,Dni+w+Plemieniu,DWP,1,2,15224,15224,112
1750,CZY+TO+X%3F,Xx,1,0,0,0,283
1751,xddd,xddd,1,0,68,68,246
1753,eeee,eeee,1,1,774,774,202
1754,PogromcY,PY,1,1,1131,1131,195
1755,cudo,C%21%21,1,1,988,988,198
1757,Lublin,LUB,1,1,1274,1274,190
1758,Oddam+wioski,OW,1,5,25709,25709,91
1760,Qwer,Qwe,1,4,8366,8366,130
1763,Altra,ALR,1,5,23924,23924,94
1764,Traktor,TRK,1,1,26,26,257
1770,ooooo,ooo,1,1,153,153,239
1771,WD40,30,1,2,6944,6944,142
1772,Jdhd,Hdhdh,1,1,2516,2516,175
1777,Chlip,CHP,1,1,998,998,197
1779,1905,CWKS,1,2,7537,7537,135
1780,Lololololol,Lol,2,3,21393,21393,97
1782,disco,dsc,1,1,639,639,208
1783,Niszczycielski+Akwedukt,NA,2,2,1681,1681,183
1785,HELLO,HELLO,2,2,1237,1237,191
1786,Pomy%C5%9Bl+zanim+kopniesz+Qunia,Q%C5%84.,1,1,3883,3883,162
1787,WCF+%21,WCF,1,1,26,26,258
1789,klin,lki,1,0,239,239,230
1790,Kruk,-KR-,1,8,32971,32971,86
1791,Wymiana,Flagi,1,1,26,26,259
1792,Winners,Win,1,1,371,371,218
1793,Sam1,Sam1,1,11,67321,67321,65
1795,Kukabaka,kUKLA,2,2,562,562,210
1797,Mi%C5%82o%C5%9Bnicy+Taniego+Piwa,Browar,18,19,21004,21004,98
1798,Gggg,Ggg,1,1,4773,4773,154
1799,Kkkkk,Kkkkk,2,2,52,52,247
1802,weRFAS,DFSAFS,2,2,103,103,244
1803,czarnuchowo,WPDS,1,1,162,162,238
1804,12345,12345,3,3,78,78,245
1806,Kto+zjad%C5%82+ciastka%3F,KZC%3F,1,1,206,206,231
1807,ZaPPFrakcja+W,CSA-W,1,0,443,443,217
1808,LECOQ,LECOQ,1,3,20560,20560,99
1809,Vexel,Vexel,1,1,178,178,234
1810,Sobie+Sam,SS,1,1,172,172,235

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,263 @@
2,1,515371643
99,4,1148596
3,7,513604231
68,8,2934253
82,12,1995368
119,13,650623
34,19,11791705
79,24,2163061
56,29,4019564
62,31,3579958
35,33,11518323
9,35,116574112
11,39,90816918
4,47,465294036
145,53,328407
120,56,632131
61,59,3640507
48,68,6533937
31,71,15537972
127,72,544908
25,77,24603199
21,80,36195899
7,85,120816085
105,89,936121
85,92,1913549
70,96,2812912
123,97,598608
55,106,4428016
22,112,30162886
133,115,476582
95,116,1243734
67,117,3041909
1,120,572571198
83,125,1945540
65,129,3202656
96,134,1224123
81,147,2028269
49,157,6305119
236,159,7890
167,176,158224
140,185,377805
251,187,1367
20,194,38560907
224,200,23586
151,206,242627
59,210,3759711
69,211,2893518
102,214,993608
213,216,32443
121,220,630577
66,234,3097023
182,236,91702
210,255,34460
50,256,6123731
178,260,100851
170,281,140209
87,285,1515968
232,287,11666
253,290,539
17,291,62760850
18,301,53752856
158,305,198650
16,309,65055844
164,317,182517
116,319,708504
148,336,267052
242,339,5459
113,355,760905
200,365,52241
5,369,176482721
115,373,711036
197,374,54819
89,375,1379428
52,377,5347117
143,382,358666
86,385,1780581
208,397,36806
46,412,6846095
156,413,215538
234,415,10061
163,429,184774
27,430,19841316
40,432,7641920
159,435,197777
44,441,7023533
183,443,83584
161,451,188672
38,452,9512471
218,474,28931
94,475,1255265
238,503,7494
71,517,2615421
135,520,454684
137,523,437089
42,546,7268867
41,548,7387675
146,554,322799
217,557,29930
29,594,16158300
172,597,139493
97,607,1218207
162,624,185431
193,625,66255
235,626,8121
147,633,269847
169,636,149152
104,647,991269
98,651,1202644
90,664,1371321
14,666,67122577
118,686,672292
174,689,135903
33,693,13927849
23,722,28313016
246,723,4610
129,733,512496
108,750,876738
93,758,1256466
141,766,365059
78,778,2169593
10,785,107610800
63,786,3554001
132,806,476872
165,809,171639
77,822,2340609
12,830,87500446
190,841,69410
75,847,2487934
6,862,136829959
84,936,1940894
64,944,3264303
222,945,27441
179,963,97544
221,965,27527
74,989,2543700
130,991,500661
32,1023,14729351
13,1039,85035694
36,1040,11104753
43,1052,7062125
109,1058,863124
58,1079,3819385
111,1096,792047
28,1108,17760154
185,1127,81545
15,1128,66569234
47,1140,6606194
39,1148,8063060
101,1161,996140
187,1163,77166
233,1166,11428
220,1170,27655
107,1209,886014
37,1226,10147516
57,1232,3875380
192,1247,66890
153,1258,223069
230,1261,13732
138,1275,399365
131,1278,481948
53,1293,4833403
76,1312,2353367
204,1317,46145
160,1333,197267
26,1336,20372946
177,1338,113620
207,1347,40837
152,1357,224264
92,1368,1288389
191,1372,68452
45,1376,6847914
201,1389,51601
103,1399,992741
19,1411,47859039
157,1416,214608
73,1418,2557465
209,1421,35273
134,1423,471241
122,1428,630185
124,1431,594841
114,1432,733473
168,1448,149206
112,1456,785196
255,1460,381
88,1466,1449811
128,1470,528181
142,1477,358920
24,1480,26406450
80,1483,2062188
225,1484,22060
215,1494,30432
176,1498,126080
8,1523,117037428
184,1526,81749
51,1528,5769388
100,1530,1117026
198,1535,52879
249,1538,3192
139,1551,395786
196,1573,56642
248,1582,3987
229,1585,13876
214,1588,31524
223,1590,25538
54,1597,4697746
166,1599,165273
110,1602,805496
180,1609,97494
202,1610,48607
30,1621,16042856
231,1626,13439
144,1627,333654
154,1636,221031
117,1638,699804
244,1643,4920
211,1645,33370
91,1648,1299521
72,1651,2577567
149,1652,261207
243,1656,5332
155,1657,215830
212,1669,32937
241,1672,5468
150,1680,249572
189,1681,69556
195,1683,64569
173,1687,137468
228,1690,16936
188,1691,74052
226,1692,17659
126,1700,575944
258,1705,62
239,1715,6946
125,1716,584874
247,1721,4371
106,1724,917830
237,1727,7801
240,1729,6680
194,1734,64596
136,1735,449124
171,1737,140112
186,1740,81233
175,1745,130123
205,1750,43707
263,1753,2
262,1754,10
254,1755,395
252,1757,1278
216,1758,30079
219,1760,27699
203,1763,46599
257,1770,124
199,1771,52625
245,1772,4774
261,1777,10
256,1779,207
60,1780,3642793
259,1783,52
250,1785,1705
206,1790,43136
181,1793,97199
260,1795,40
227,1797,17184

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,213 @@
2,1,197149923
163,4,7808
4,7,133940808
89,8,155525
114,12,71331
119,13,63826
29,19,3109409
80,24,205544
60,29,419592
68,31,271134
99,33,127014
6,35,67576037
8,39,38547158
1,47,236152747
187,53,1297
102,56,107411
108,59,89693
45,68,1066395
16,71,8406402
133,72,38620
34,77,2196064
25,80,4699158
5,85,86023620
105,89,94543
79,92,208853
129,96,40098
137,97,33470
39,106,1547869
38,112,1711002
142,115,25141
110,116,85225
146,117,21965
3,120,139926286
100,125,110559
111,129,82762
62,134,397211
112,147,80447
61,157,415697
152,176,16504
166,185,7378
31,194,2607720
208,200,30
83,210,178718
71,211,257208
127,214,41521
211,216,12
161,220,8278
65,234,362768
202,236,52
33,256,2264454
156,260,10522
91,285,150587
174,287,4521
9,291,36875586
11,301,26806801
148,305,19292
10,309,36138019
118,319,67239
178,336,3986
7,369,58830293
128,373,40352
200,374,99
84,375,174378
67,377,331213
196,382,291
90,385,153097
52,412,642975
32,430,2549096
24,432,5051794
147,435,20699
55,441,579188
190,443,1031
48,452,725489
138,475,30918
183,503,2275
172,517,4826
96,520,137000
176,523,4107
35,546,2097153
41,548,1309325
207,554,32
188,557,1239
37,594,1766507
160,597,8289
74,607,222168
181,624,2475
123,633,51266
124,636,48384
113,647,72783
97,651,136651
150,664,18675
17,666,8113232
120,686,61938
23,693,5125520
27,722,3734858
95,733,141728
107,750,91301
77,758,212637
130,766,40018
154,778,16261
15,785,8726932
58,786,492119
82,806,187855
76,822,214844
20,830,6182634
153,841,16412
73,847,241905
12,862,18894601
40,936,1367259
72,944,249585
198,945,114
169,963,6190
182,965,2359
49,989,702186
104,991,99680
46,1023,869386
13,1039,10258911
36,1040,1922517
51,1052,659407
125,1058,44295
85,1079,172850
135,1096,36721
30,1108,2992607
136,1127,35542
18,1128,7828246
21,1140,6065875
42,1148,1223288
121,1161,59985
140,1163,28985
193,1166,365
170,1170,6131
81,1209,200678
26,1226,4223030
86,1232,171782
168,1261,6589
63,1275,394386
149,1278,19193
66,1293,351269
53,1312,635357
205,1317,42
171,1333,5757
28,1336,3119338
210,1347,15
141,1357,26793
92,1368,149732
179,1372,3874
47,1376,783132
122,1399,57170
22,1411,5711015
157,1416,10013
64,1418,364951
180,1421,3128
115,1423,70186
54,1428,610324
164,1431,7530
116,1432,67981
98,1448,132845
155,1456,11762
103,1466,101232
57,1470,507857
191,1477,375
19,1480,7053464
87,1483,171122
167,1494,7195
209,1498,19
14,1523,9693986
177,1526,4100
59,1528,476359
134,1530,36737
162,1535,7897
109,1551,86090
194,1573,326
201,1582,55
197,1585,281
143,1588,25002
50,1597,668744
131,1599,39978
145,1602,23331
203,1609,52
43,1621,1204990
158,1626,9530
139,1627,29761
75,1636,220320
101,1638,107892
173,1643,4638
44,1648,1091715
88,1651,166503
69,1652,258353
184,1656,2129
132,1657,38951
159,1669,9010
213,1672,1
93,1680,149155
144,1681,24465
186,1683,1682
185,1687,1713
192,1691,370
151,1692,17635
117,1700,67818
56,1716,523524
175,1721,4371
78,1724,210586
199,1729,106
70,1735,257705
189,1737,1032
165,1745,7416
212,1763,9
94,1780,142522
204,1783,50
195,1785,296
126,1790,43136
106,1793,91636
206,1795,40

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,259 @@
3,1,223526800
91,4,1123538
2,7,263707452
66,8,2442577
78,12,1791593
116,13,586792
33,19,7654576
73,24,1956734
52,29,3536233
56,31,3182520
31,33,7967918
15,35,30817347
12,39,40733659
4,47,123030942
134,53,327110
118,56,524360
55,59,3236269
44,68,5126302
36,71,6435280
119,72,506287
22,77,18308136
17,80,27243852
18,85,26537205
99,89,819602
80,92,1704695
61,96,2763830
117,97,543960
65,106,2461280
19,112,24098705
125,115,432992
90,116,1158499
63,117,2637247
1,120,273736161
77,125,1826223
58,129,3053157
102,134,788292
74,147,1947811
46,157,4950615
225,159,7890
159,176,141720
130,185,370427
245,187,1367
16,194,29684725
210,200,23556
142,206,242627
53,210,3465436
67,211,2411001
101,214,791197
216,216,17866
113,220,600370
62,234,2733729
172,236,91650
201,255,34460
60,256,2894965
174,260,90324
168,281,109440
86,285,1306890
227,287,7145
248,290,539
21,291,19185870
38,301,6194947
154,305,178401
30,309,8632397
153,317,182517
110,319,638904
141,336,263066
233,339,5459
104,355,760905
189,365,52241
13,369,38986612
108,373,670466
186,374,54720
89,375,1195885
47,377,4922975
132,382,358375
82,385,1615856
200,397,36806
41,412,5899052
145,413,215538
222,415,10061
151,429,184774
24,430,16198878
71,432,2040203
158,435,162816
37,441,6276638
175,443,82553
150,451,188672
32,452,7720010
204,474,28931
87,475,1224347
234,503,5219
64,517,2609213
137,520,313250
126,523,432982
48,546,4265938
49,548,4231284
135,554,322767
205,557,28691
28,594,11702793
162,597,131188
96,607,979477
152,624,182954
179,625,66255
224,626,8121
144,633,218581
169,636,100606
97,647,893889
93,651,1039357
85,664,1352646
11,666,48156459
112,686,602468
161,689,135903
34,693,7123124
20,722,22025239
237,723,4610
133,733,328377
106,750,735077
95,758,1010984
136,766,322406
70,778,2153298
7,785,82715139
75,786,1933759
140,806,276830
156,809,171639
76,822,1928071
8,830,71201569
187,841,52998
69,847,2171639
5,862,101830140
120,936,477351
59,944,2957488
207,945,27327
173,963,90726
209,965,25168
81,989,1684724
129,991,393721
29,1023,11579200
9,1039,60773093
35,1040,6807047
39,1052,6122989
100,1058,811470
68,1079,2218960
105,1096,752682
26,1108,13488903
195,1127,46003
10,1128,54938117
124,1140,443639
40,1148,5966245
122,1161,473253
192,1163,47907
221,1166,11063
214,1170,19000
111,1209,635798
43,1226,5640076
51,1232,3588148
178,1247,66890
143,1258,223069
229,1261,6352
235,1275,4979
123,1278,462546
50,1293,3808303
83,1312,1602570
194,1317,46103
149,1333,191510
25,1336,15190900
167,1338,113618
199,1347,40822
147,1357,197411
92,1368,1114175
181,1372,64564
42,1376,5740497
190,1389,51599
98,1399,860657
14,1411,36967078
146,1416,204595
84,1418,1398761
202,1421,32137
128,1423,401050
223,1428,9859
115,1431,587311
109,1432,665488
218,1448,16361
103,1456,769792
250,1460,381
88,1466,1197564
213,1470,20287
131,1477,358545
23,1480,17352076
79,1483,1762582
212,1484,22040
211,1494,23237
163,1498,126061
6,1523,91796591
184,1526,60390
45,1528,5076313
94,1530,1014380
197,1535,44982
242,1538,3192
139,1551,283986
185,1573,56269
239,1582,3932
220,1585,13591
228,1588,6522
208,1590,25538
54,1597,3454766
164,1599,125295
121,1602,475515
171,1609,97442
191,1610,48607
27,1621,12298812
240,1626,3909
138,1627,302333
247,1636,711
114,1638,591912
251,1643,282
206,1645,28423
148,1648,194797
72,1651,2038539
243,1652,2854
241,1656,3203
155,1657,176879
215,1669,18439
232,1672,5467
170,1680,97513
196,1681,45091
182,1683,62887
166,1687,117365
217,1690,16936
177,1691,73682
255,1692,24
127,1700,428102
254,1705,62
230,1715,6260
183,1716,61350
107,1724,692133
226,1727,7801
238,1729,4434
180,1734,64596
157,1735,164228
160,1737,139080
176,1740,81019
165,1745,122707
198,1750,43707
259,1753,2
257,1754,10
249,1755,395
246,1757,1278
203,1758,30079
193,1763,46590
253,1770,124
188,1771,52625
236,1772,4774
256,1777,10
252,1779,207
57,1780,3095378
258,1783,2
244,1785,1409
231,1793,5563
219,1797,15811

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
a:1:{s:5:"pl181";s:25:"https://pl181.plemiona.pl";}

View File

@ -0,0 +1 @@
a:0:{}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,227 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<config>
<main>
<max_level>30</max_level>
<min_level>1</min_level>
<wood>90</wood>
<stone>80</stone>
<iron>70</iron>
<pop>5</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>900</build_time>
<build_time_factor>1.2</build_time_factor>
</main>
<barracks>
<max_level>25</max_level>
<min_level>0</min_level>
<wood>200</wood>
<stone>170</stone>
<iron>90</iron>
<pop>7</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.28</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>1800</build_time>
<build_time_factor>1.2</build_time_factor>
</barracks>
<stable>
<max_level>20</max_level>
<min_level>0</min_level>
<wood>270</wood>
<stone>240</stone>
<iron>260</iron>
<pop>8</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.28</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>6000</build_time>
<build_time_factor>1.2</build_time_factor>
</stable>
<garage>
<max_level>15</max_level>
<min_level>0</min_level>
<wood>300</wood>
<stone>240</stone>
<iron>260</iron>
<pop>8</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.28</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>6000</build_time>
<build_time_factor>1.2</build_time_factor>
</garage>
<snob>
<max_level>1</max_level>
<min_level>0</min_level>
<wood>15000</wood>
<stone>25000</stone>
<iron>10000</iron>
<pop>80</pop>
<wood_factor>2</wood_factor>
<stone_factor>2</stone_factor>
<iron_factor>2</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>586800</build_time>
<build_time_factor>1.2</build_time_factor>
</snob>
<smith>
<max_level>20</max_level>
<min_level>0</min_level>
<wood>220</wood>
<stone>180</stone>
<iron>240</iron>
<pop>20</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>6000</build_time>
<build_time_factor>1.2</build_time_factor>
</smith>
<place>
<max_level>1</max_level>
<min_level>0</min_level>
<wood>10</wood>
<stone>40</stone>
<iron>30</iron>
<pop>0</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>10860</build_time>
<build_time_factor>1.2</build_time_factor>
</place>
<statue>
<max_level>1</max_level>
<min_level>0</min_level>
<wood>220</wood>
<stone>220</stone>
<iron>220</iron>
<pop>10</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>1500</build_time>
<build_time_factor>1.2</build_time_factor>
</statue>
<market>
<max_level>25</max_level>
<min_level>0</min_level>
<wood>100</wood>
<stone>100</stone>
<iron>100</iron>
<pop>20</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>2700</build_time>
<build_time_factor>1.2</build_time_factor>
</market>
<wood>
<max_level>30</max_level>
<min_level>0</min_level>
<wood>50</wood>
<stone>60</stone>
<iron>40</iron>
<pop>5</pop>
<wood_factor>1.25</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.245</iron_factor>
<pop_factor>1.155</pop_factor>
<build_time>900</build_time>
<build_time_factor>1.2</build_time_factor>
</wood>
<stone>
<max_level>30</max_level>
<min_level>0</min_level>
<wood>65</wood>
<stone>50</stone>
<iron>40</iron>
<pop>10</pop>
<wood_factor>1.27</wood_factor>
<stone_factor>1.265</stone_factor>
<iron_factor>1.24</iron_factor>
<pop_factor>1.14</pop_factor>
<build_time>900</build_time>
<build_time_factor>1.2</build_time_factor>
</stone>
<iron>
<max_level>30</max_level>
<min_level>0</min_level>
<wood>75</wood>
<stone>65</stone>
<iron>70</iron>
<pop>10</pop>
<wood_factor>1.252</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.24</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>1080</build_time>
<build_time_factor>1.2</build_time_factor>
</iron>
<farm>
<max_level>30</max_level>
<min_level>1</min_level>
<wood>45</wood>
<stone>40</stone>
<iron>30</iron>
<pop>0</pop>
<wood_factor>1.3</wood_factor>
<stone_factor>1.32</stone_factor>
<iron_factor>1.29</iron_factor>
<pop_factor>1</pop_factor>
<build_time>1200</build_time>
<build_time_factor>1.2</build_time_factor>
</farm>
<storage>
<max_level>30</max_level>
<min_level>1</min_level>
<wood>60</wood>
<stone>50</stone>
<iron>40</iron>
<pop>0</pop>
<wood_factor>1.265</wood_factor>
<stone_factor>1.27</stone_factor>
<iron_factor>1.245</iron_factor>
<pop_factor>1.15</pop_factor>
<build_time>1020</build_time>
<build_time_factor>1.2</build_time_factor>
</storage>
<hide>
<max_level>10</max_level>
<min_level>0</min_level>
<wood>50</wood>
<stone>60</stone>
<iron>50</iron>
<pop>2</pop>
<wood_factor>1.25</wood_factor>
<stone_factor>1.25</stone_factor>
<iron_factor>1.25</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>1800</build_time>
<build_time_factor>1.2</build_time_factor>
</hide>
<wall>
<max_level>20</max_level>
<min_level>0</min_level>
<wood>50</wood>
<stone>100</stone>
<iron>20</iron>
<pop>5</pop>
<wood_factor>1.26</wood_factor>
<stone_factor>1.275</stone_factor>
<iron_factor>1.26</iron_factor>
<pop_factor>1.17</pop_factor>
<build_time>3600</build_time>
<build_time_factor>1.2</build_time_factor>
</wall>
</config>

View File

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<config>
<speed>1</speed>
<unit_speed>1</unit_speed>
<moral>1</moral>
<build>
<destroy>1</destroy>
</build>
<misc>
<kill_ranking>2</kill_ranking>
<tutorial>5</tutorial>
<trade_cancel_time>300</trade_cancel_time>
</misc>
<commands>
<millis_arrival>1</millis_arrival>
<command_cancel_time>600</command_cancel_time>
</commands>
<newbie>
<days>7</days>
<ratio_days>60</ratio_days>
<ratio>20</ratio>
<removeNewbieVillages>1</removeNewbieVillages>
</newbie>
<game>
<buildtime_formula>2</buildtime_formula>
<knight>3</knight>
<knight_new_items></knight_new_items>
<archer>1</archer>
<tech>2</tech>
<farm_limit>0</farm_limit>
<church>0</church>
<watchtower>0</watchtower>
<stronghold>1</stronghold>
<fake_limit>1</fake_limit>
<barbarian_rise>0.003</barbarian_rise>
<barbarian_shrink>1</barbarian_shrink>
<barbarian_max_points>2000</barbarian_max_points>
<scavenging>1</scavenging>
<hauls>1</hauls>
<hauls_base>1000</hauls_base>
<hauls_max>100000</hauls_max>
<base_production>30</base_production>
<event>10</event>
<suppress_events>0</suppress_events>
</game>
<buildings>
<custom_main>-1</custom_main>
<custom_farm>-1</custom_farm>
<custom_storage>-1</custom_storage>
<custom_place>-1</custom_place>
<custom_barracks>-1</custom_barracks>
<custom_church>-1</custom_church>
<custom_smith>-1</custom_smith>
<custom_wood>-1</custom_wood>
<custom_stone>-1</custom_stone>
<custom_iron>-1</custom_iron>
<custom_market>-1</custom_market>
<custom_stable>-1</custom_stable>
<custom_wall>-1</custom_wall>
<custom_garage>-1</custom_garage>
<custom_hide>-1</custom_hide>
<custom_snob>-1</custom_snob>
<custom_statue>-1</custom_statue>
<custom_watchtower>-1</custom_watchtower>
</buildings>
<snob>
<gold>1</gold>
<cheap_rebuild>0</cheap_rebuild>
<rise>2</rise>
<max_dist>1000</max_dist>
<factor>0.9</factor>
<coin_wood>28000</coin_wood>
<coin_stone>30000</coin_stone>
<coin_iron>25000</coin_iron>
<no_barb_conquer></no_barb_conquer>
</snob>
<ally>
<no_harm>0</no_harm>
<no_other_support>1</no_other_support>
<no_other_support_type>0</no_other_support_type>
<allytime_support>0</allytime_support>
<no_leave>0</no_leave>
<no_join>0</no_join>
<limit>50</limit>
<fixed_allies>0</fixed_allies>
<wars_member_requirement>5</wars_member_requirement>
<wars_points_requirement>15000</wars_points_requirement>
<wars_autoaccept_days>7</wars_autoaccept_days>
<levels>1</levels>
<xp_requirements>v1</xp_requirements>
</ally>
<coord>
<map_size>1000</map_size>
<func>4</func>
<empty_villages>70</empty_villages>
<bonus_villages>10</bonus_villages>
<inner>8287</inner>
<select_start>1</select_start>
<village_move_wait>336</village_move_wait>
<noble_restart>1</noble_restart>
<start_villages>1</start_villages>
</coord>
<sitter>
<allow>1</allow>
</sitter>
<sleep>
<active>0</active>
<delay>60</delay>
<min>6</min>
<max>10</max>
<min_awake>12</min_awake>
<max_awake>36</max_awake>
<warn_time>10</warn_time>
</sleep>
<night>
<active>1</active>
<start_hour>23</start_hour>
<end_hour>8</end_hour>
<def_factor>2</def_factor>
<duration>14</duration>
</night>
<win>
<check>5</check>
</win>
</config>

View File

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<config>
<spear>
<build_time>1020</build_time>
<pop>1</pop>
<speed>18</speed>
<attack>10</attack>
<defense>15</defense>
<defense_cavalry>45</defense_cavalry>
<defense_archer>20</defense_archer>
<carry>25</carry>
</spear>
<sword>
<build_time>1500</build_time>
<pop>1</pop>
<speed>22</speed>
<attack>25</attack>
<defense>50</defense>
<defense_cavalry>15</defense_cavalry>
<defense_archer>40</defense_archer>
<carry>15</carry>
</sword>
<axe>
<build_time>1320</build_time>
<pop>1</pop>
<speed>18</speed>
<attack>40</attack>
<defense>10</defense>
<defense_cavalry>5</defense_cavalry>
<defense_archer>10</defense_archer>
<carry>10</carry>
</axe>
<archer>
<build_time>1800</build_time>
<pop>1</pop>
<speed>18</speed>
<attack>15</attack>
<defense>50</defense>
<defense_cavalry>40</defense_cavalry>
<defense_archer>5</defense_archer>
<carry>10</carry>
</archer>
<spy>
<build_time>900</build_time>
<pop>2</pop>
<speed>9</speed>
<attack>0</attack>
<defense>2</defense>
<defense_cavalry>1</defense_cavalry>
<defense_archer>2</defense_archer>
<carry>0</carry>
</spy>
<light>
<build_time>1800</build_time>
<pop>4</pop>
<speed>10</speed>
<attack>130</attack>
<defense>30</defense>
<defense_cavalry>40</defense_cavalry>
<defense_archer>30</defense_archer>
<carry>80</carry>
</light>
<marcher>
<build_time>2700</build_time>
<pop>5</pop>
<speed>10</speed>
<attack>120</attack>
<defense>40</defense>
<defense_cavalry>30</defense_cavalry>
<defense_archer>50</defense_archer>
<carry>50</carry>
</marcher>
<heavy>
<build_time>3600</build_time>
<pop>6</pop>
<speed>11</speed>
<attack>150</attack>
<defense>200</defense>
<defense_cavalry>80</defense_cavalry>
<defense_archer>180</defense_archer>
<carry>50</carry>
</heavy>
<ram>
<build_time>4800</build_time>
<pop>5</pop>
<speed>30</speed>
<attack>2</attack>
<defense>20</defense>
<defense_cavalry>50</defense_cavalry>
<defense_archer>20</defense_archer>
<carry>0</carry>
</ram>
<catapult>
<build_time>7200</build_time>
<pop>8</pop>
<speed>30</speed>
<attack>100</attack>
<defense>100</defense>
<defense_cavalry>50</defense_cavalry>
<defense_archer>100</defense_archer>
<carry>0</carry>
</catapult>
<knight>
<build_time>21600</build_time>
<pop>10</pop>
<speed>10</speed>
<attack>150</attack>
<defense>250</defense>
<defense_cavalry>400</defense_cavalry>
<defense_archer>150</defense_archer>
<carry>100</carry>
</knight>
<snob>
<build_time>18000</build_time>
<pop>100</pop>
<speed>35</speed>
<attack>30</attack>
<defense>100</defense>
<defense_cavalry>50</defense_cavalry>
<defense_archer>100</defense_archer>
<carry>0</carry>
</snob>
<militia>
<build_time>1</build_time>
<pop>0</pop>
<speed>0.016666666666667</speed>
<attack>0</attack>
<defense>15</defense>
<defense_cavalry>45</defense_cavalry>
<defense_archer>25</defense_archer>
<carry>0</carry>
</militia>
</config>

View File

@ -0,0 +1,282 @@
1,Konfederacja,CSA-X,50,9722,80591153,85672571,1
4,Farmerzy,Farma,1,2,9811,9811,125
7,Spoceni+Kuzyni,KUZYNI,39,4721,39582695,39582695,4
8,W+O+W,WOW,10,10,26603,26603,90
12,AveMy,AveMy,2,1,6060,6060,144
13,FarmerzyPremium,P.P,1,1,490,490,214
19,Wojna+Domowa+Centrum,%2AWDC%2A,2,1,129,129,239
24,Anonymous,IT,17,21,70935,70935,63
29,Elitarne+plemie+zbieraczy+PP,EPZPP,50,122,487760,490595,32
31,Project+D,PD,20,28,72338,72338,62
33,Towarzystwo+Wzajemnej+Asekuracji,TWA,25,62,248240,248240,44
35,MotoMyszy.,MzM,48,4090,35366910,35967206,6
39,OZDR+%2B+Why,Ozdr%40,27,342,2415762,2415762,15
47,Konfederacja+Z,CSA-Z,48,9596,77915569,82611770,2
53,Zakon+Zielonego+Li%C5%9Bcia,420,1,13,50577,50577,71
56,Pot%C4%99%C5%BCne+Pelikany,%2APP%2A,1,1,678,678,205
59,Znani+i+Nieznani,ZiN,9,10,18104,18104,105
68,Obro%C5%84cy+Cadii,Cadia,20,104,490637,490637,31
71,why+so+serious,Why%3F,26,1160,10008304,10008304,10
72,Dinozaury,DINO,3,5,16182,16182,108
77,Wyznawcy+Darksizmu,-WzDa-,5,5,3948,3948,160
80,Legion,-LM-,13,31,162555,162555,49
85,Motomyszy,MzM.,50,4622,39147296,40987712,5
89,FRIENDOLINOS,OG,2,0,182,182,233
92,MotoMyszy%21,MzM%21,1,1,3421,3421,165
96,Zakon+Czerwonej+R%C3%B3%C5%BCy,Z.C.R,12,13,19300,19300,101
97,FARMERZY+PLEMION,FARME,1,6,23599,23599,95
106,GWIEZDNA+FEDERACJA,GF,24,342,1922259,1922259,16
112,co%C5%9B+wi%C4%99cej,CW,4,3,1131,1131,194
115,zgierzanie,zgr,1,7,46100,46100,75
117,Przybysze+z+kosmosu,Pzk,5,5,19943,19943,100
120,Orkowi+Zawodnicy+Dominuj%C4%85+Rybki,OZDR,49,5538,47095138,48430662,3
125,Szcz%C4%99%C5%9Bliwi+Gracze,SG,4,6,33644,33644,85
129,PREM,Punkty,5,19,24990,24990,93
134,DarNocy,DN,1,5,31116,31116,87
147,Bandycka+Elita+Niskoros%C5%82ych,BENIS,1,0,0,0,258
157,Domino,Dom,34,181,930020,930020,25
159,Oggr,Ogg,1,0,400,400,215
176,Albanski+Raj,AR,2,6,42674,42674,78
185,NISZCZYCIELE,%7CN%7C,1,0,0,0,259
187,Champions+League,-ChL-,1,0,347,347,220
194,Vis+Maior,VS,17,151,830193,830193,26
200,Takie+tam,Ttm.,1,0,561,561,211
206,Pppp,P..p,1,0,578,578,210
210,NoPon,N-P,48,69,208123,209067,47
211,%2APotrzymaj+mi+Piwo,%2APmP,2,5,18368,18368,104
214,Armia+Bosmana,BOSMAN,3,3,4308,4308,157
216,Plemie+Igora,P.L.I,1,0,0,0,260
220,Amatorzy+Kiszonych+Og%C3%B3rk%C3%B3w,ALKO,3,3,2264,2264,177
234,Pepeki123,pepek,24,28,82699,82699,57
236,Nakr%C4%99cane+Myszy,NM,1,0,262,262,226
255,-QED-,QED,1,3,23228,23228,96
256,GET+this+osada,GETTO,1,1,2552,2552,172
260,B%C5%82%C4%99kitna+Planeta,%2ABP%2A,1,0,5873,5873,146
281,Liga+Mistrzow,LM,1,3,5950,5950,145
285,Kompletnie+Bezsensowne+Plemi%C4%99+xD,KBS,17,52,216187,216187,46
287,fififi,fi,1,3,10461,10461,122
290,Komercja+Plemionn,K+-+P,1,0,197,197,231
291,MotoMyszy%3F,.Mzm.,47,2600,19944126,20492470,8
301,Psycho+szczury,MzM..,36,1860,14082725,14082725,9
305,Pro+Sto,Pro,1,1,7528,7528,136
309,Konfederacja+Y,CSA-Y,15,1002,8457463,8457463,11
317,Szalone+Nied%C5%BAwiedzie,Mi%C5%9Bki,1,0,4609,4609,156
319,PAKT,PAKT,2,2,6323,6323,143
336,hkgj,kw,1,0,0,0,261
339,ZARZEW,ZRW,1,0,2804,2804,169
355,uuuuuuuuuuuuuuu,uuu,1,0,4128,4128,159
365,GIE%C5%81DA,GA,1,0,8516,8516,129
369,0rkowi+Zawodnicy+Dominuj%C4%85+Rybki,0ZDR,36,3034,26181329,26181329,7
373,Gildia+Kupiecka,GK,2,3,13810,13810,115
374,xyz.,xyz.,1,0,901,901,197
375,PePeKi+PP.PP,PKTPP,17,16,39813,39813,80
377,AKADEMIA+WD,AWD,24,25,54591,54591,68
382,HANDEL,HANDEL,1,1,2203,2203,178
385,Bia%C5%82a+Armia,B.A,5,17,81013,81013,58
397,Emka,E.M.,1,1,1170,1170,193
412,BOMBA,BOMBA,22,110,411596,411596,35
413,Giht,Hggf,1,1,1374,1374,189
415,.%3Axxx%3A.,xxxx,1,0,26,26,247
429,Zabi+Staw,Z-S,1,0,855,855,199
430,%2A%2AWojna+Idei%2A%2A,%2A%2AWD%2A%2A,1,0,0,0,262
432,McOpole,McOpo,21,210,1263914,1263914,21
435,ave+sieci,sieci,1,1,4647,4647,155
441,Project+D%21,PD%21,24,45,103116,103116,55
443,PEAKY+BLINDERS,PB,1,0,0,0,263
451,AVE+%28M%29,AVE%28M%29,1,0,173,173,234
452,Obro%C5%84cy+Krasnali+Ogroduwych,OKO,50,111,389742,392037,36
474,zagubiony+natanek,wul,1,0,536,536,212
475,Zbieracze+Punktow+Premium,Z%2AP%2AP,2,2,9372,9372,128
503,TMPL,TMP,1,1,2332,2332,176
517,M%C3%B3j+Dom,%3D+MD+%3D,2,1,1204,1204,191
520,ESSA,ESSA,2,6,25610,25610,92
523,Wiocha,Yuby,1,0,280,280,223
546,WOJNA+IDEI,WD,1,1,50,50,246
548,Co+Chcesz%3F,CO,1,1,317,317,222
554,%3Dpremium%3D,pp.,3,2,4850,4850,154
557,WYROLOWANI,WYROL,1,5,39927,39927,79
594,T+E+R+Y+T+O+R+I+U+M,%5DT%5B,4,4,13708,13708,116
597,Bractwo+Krzy%C5%BCowe,%2BBK%2B,2,1,7686,7686,133
607,NAJEMNICY.,N%2FM%2FY,5,22,96031,96031,56
624,K35+DEMONY,K35,1,3,19050,19050,103
625,Wilki,Wilki,1,0,887,887,198
626,Targowica,Targ,1,3,11298,11298,120
633,Wolny,WS,1,16,80649,80649,59
636,Superpremium,%28%24%29,5,5,5393,5393,149
647,Ow%C5%82osione+Rogale,OwR,7,11,36541,36541,82
651,Semper+Invicta,Sempe,3,4,12098,12098,119
664,Kal-Kol,K+L+N,3,2,7408,7408,137
666,KOM0RNICY+2,KOM2,27,502,3623764,3623764,13
686,Semper+Invicta.,Semp.,3,2,3186,3186,167
689,Ga%C5%9Bnice+Po%C5%BCarowe+Stra%C5%BCaka,GPS%21,1,0,132,132,238
693,Why+So+Serious%3F,Why,1,0,0,0,264
722,Bractwo+Nocnych+Polan,BNP,30,194,1057120,1057120,22
723,Raki+nie+boraki,Rnb,1,1,2771,2771,170
733,Kuzyni+2,KUZYNA,1,1,26,26,248
750,Moje+OHV,OHV,1,0,277,277,224
758,-300-,-300-,5,6,13864,13864,114
766,%2AAnonymous%2A,%2AAMS%2A,1,0,0,0,265
778,Imperium+Polskie,IP,12,11,29666,29666,88
785,KOMORNICY3,KOM3,37,744,5127712,5127712,12
786,JP2+2137,21%3A37,7,48,259042,259042,42
806,Cesarstwo+Zachodnio+Rzymskie,SPQR,1,0,26,26,249
809,NOC3,NOC3,1,0,367,367,218
822,%2AGramy+Dla+Zabawy%2A%2A,%2AGDZ%2A%2A,2,10,42703,42703,77
830,Komornicy,KOM1,3,13,74502,74502,61
841,PP+Pan+Dziobak,PEPE,1,1,771,771,202
847,Nowa+nadzieja,Nowa,35,120,361076,361076,39
862,IMPERIUM+%2B,.%3A%2B%3A.,31,280,1738908,1738908,18
936,Gracz+bula9001+zablokowa%C5%82+ci%C4%99.,bula90,1,8,77623,77623,60
944,YOGI,YOGI,7,14,60146,60146,66
945,Brygada+RR,RR,1,0,726,726,204
963,Grupa+Amerykanka,GAZ,2,2,2349,2349,174
965,Kamilanie+Gora,KG,1,0,1878,1878,179
989,KOMORNICYX,KOMX,2,1,9905,9905,124
991,Ordo+Theutonicorum,OT,1,0,0,0,266
1023,AWANGARDA,.%29A%28.,3,14,53881,53881,69
1039,IMPERIUM+%2B%2B,%3A%2B%3A,11,107,569479,569479,30
1040,We+Are+Ready%21,WAR%21,2,3,18048,18048,106
1052,Gachi+Frens,-%3DGF%3D-,11,28,141286,141286,51
1058,Powa%C5%BCneUgrupowanieBy%C5%82ychGraczy,PUBG,1,1,10021,10021,123
1079,Rycerze+Czerwonego+Tartanu,RCT,6,56,374051,374051,37
1096,DNR+F,ACHTUN,4,7,39593,39593,81
1108,K0MORNICY4,KOM4,12,68,334647,334647,40
1127,BLOCKCHAIN,CRYPTO,1,8,50239,50239,72
1128,Nazwa+b%C4%99dzie+wkr%C3%B3tce,NBW,16,80,415954,415954,34
1140,0.7+zg%C5%82o%C5%9B+si%C4%99,POLEJ,8,135,1020829,1020829,24
1148,HELLGATE,%2AHG%2A,9,61,237863,237863,45
1161,Ose%C5%82ka,OS.,1,2,13553,13553,117
1163,Kl8F,Klasa8,2,2,12795,12795,118
1166,Dybuk,Dybuk,1,3,19291,19291,102
1170,Nono,Nnn,1,0,0,0,267
1209,Komandosi+na+5,KOM5,2,5,20529,20529,99
1226,Cartel+TW,Cartel,40,477,3232718,3232718,14
1232,Braty+i+Kompany,BiK,4,4,1437,1437,187
1247,%C5%BCydek+natanek,qwq,1,0,261,261,227
1258,Bum%21,Bum%21,1,0,128,128,240
1261,Ujazdowcy,UJ,1,2,6741,6741,141
1275,CSA-ATAK,CSA-AT,1,0,26,26,250
1278,Waffen-SS,W-SS,1,3,7237,7237,139
1293,youll+never+walk+alone,ynwa,11,50,302223,302223,41
1312,Purpurowi+Zegarmistrze+%C5%9Awiat%C5%82a,ZEGARY,46,185,707516,708850,28
1317,1edc,1edc,1,0,26,26,251
1333,Grupa+Wsparcia+Amator%C3%B3w,GWA,1,0,814,814,200
1336,Scandi+Power,SCP,21,266,1529373,1529373,19
1338,weee,wg,1,0,0,0,268
1347,BezCov,B-C,3,2,1827,1827,181
1357,J.+B.+B....,JBB%3B%2F,1,0,0,0,269
1368,Elitarny+Legion,ELITA,2,18,68427,68427,64
1372,WIDMO,WIDMO,1,0,0,0,270
1376,Wojna+Idei+P,WDP,1,1,628,628,208
1389,dfbdfbd,db,1,0,4958,4958,153
1399,Bojk%C3%B3w,_B_,3,6,36117,36117,83
1411,HURAGAN,Tajfun,28,255,1414392,1414392,20
1416,Z%C5%82odzieje+Przysz%C5%82o%C5%9Bci,%3DZP%3D,1,1,1857,1857,180
1418,Plemi%C4%99+Rodu+Smoka,PRS,3,22,174240,174240,48
1421,Dla+fanu+pykamy,DFP,1,0,1674,1674,184
1423,Grupa+Armii+%C5%9Arodek,%C5%9Arodek,2,11,52902,52902,70
1428,Wodne+zwierzaczki,WZ,1,3,17761,17761,107
1431,Amanita+Muscaria,A-M,3,2,1513,1513,186
1432,Nasze+Plemie,ABW,1,1,1675,1675,183
1448,myself,%3DMf%3D,1,0,0,0,271
1456,1-2-0,1x2,2,2,10863,10863,121
1460,bobertos,ZIOM,2,1,200,200,230
1466,GREEN+STREET+HOOLIGANS,GSH,7,20,113693,113693,54
1470,SunnyValley,SV,1,6,45642,45642,76
1477,Do+ko%C5%84ca%21,DK%21,1,1,360,360,219
1480,KUZYN+X,KUZYN%3F,15,331,1765223,1765223,17
1483,Afrika+Korps,AK,1,0,0,0,272
1484,INVISIBLE,IV,1,0,26,26,252
1494,Wioska+Matrix9105%40,Matrix,1,0,0,0,273
1498,Kokoko,KKK7,1,0,2870,2870,168
1523,Ty+i+Twoje+orzeszki,T.T,26,115,655456,655456,29
1526,Polanie,Polani,1,0,0,0,274
1528,NieZniszczalni.,NZ,3,3,2617,2617,171
1530,S%C5%81OWIANIE,S%C5%81OWO,3,3,6555,6555,142
1535,The+Gorillas,GOR,2,26,142004,142004,50
1538,Ho+no+tu,SOO,1,2,7382,7382,138
1551,Siewca+Wiatru,%7ESW%7E,7,14,49245,49245,73
1573,DUCHY,DUCH,11,10,9541,9541,127
1582,Ca%C5%82e+%C5%BBycie+z+Wariatami,WARIAT,1,1,8160,8160,132
1585,SAM+WE+M%C5%81YNIE,SWM,1,0,744,744,203
1588,Moment+Strategiczny,no+c%C3%B3%C5%BC,1,12,59739,59739,67
1590,Bo+od+tylu+tez+jest+fajnie,Xes,5,5,3318,3318,166
1597,Kontra,Kontra,42,181,807847,815265,27
1599,ma%C5%82e+ciche+do+g%C4%99siej+szyji,mcgs,1,0,369,369,217
1602,Uuuu,Uuy,1,1,3854,3854,163
1609,asdd,das,1,0,0,0,275
1610,Kombinat+Punkkt%C3%B3w+Premium,KPP,1,0,138,138,237
1621,Rolnicy+Podlasie,RP,11,186,1025745,1025745,23
1626,JazdaZKuramk,JZK,1,0,0,0,276
1627,ANONYMOUSS,ANS,15,43,114308,114308,53
1636,GDZIE+S%C4%84+%3F%3F%3F,MA%C5%81YSZ,1,1,4193,4193,158
1638,asyy,asyy,1,0,26,26,253
1643,1112,12,1,0,0,0,277
1645,Rekontakt,REK,2,3,8492,8492,130
1648,Aldente,Ald,1,1,338,338,221
1651,Oszukani,New,2,1,3936,3936,161
1652,%C5%81omocimy,Zaj%C4%99nc,1,7,15985,15985,109
1656,Robotniczy+Klub+Sportowy+HUWDU,HUWDU,1,1,270,270,225
1657,Xyz%2C,Xyz%2C,1,0,513,513,213
1669,Mocny+FULL,FULL,4,6,14440,14440,113
1672,MKM.,MKM.,1,2,9572,9572,126
1680,Mymu,My,2,4,27342,27342,89
1681,fehg,wwerj,1,0,0,0,278
1683,......,FIN,1,9,49140,49140,74
1687,SoSKooperacja,SoS,7,7,15033,15033,112
1690,Nie%C5%9Bmiertelni,ookp,1,1,2343,2343,175
1691,Zbieram+flagi,Zbf,1,4,7533,7533,135
1692,Zapraszam+ch%C4%99tnych,Buuu,1,1,5178,5178,150
1700,Fiku+Miku,FIUFIU,4,71,373191,373191,38
1705,Galaktyczna+Federacja+%C5%9Awiat%C5%82a,GF+II,1,1,1671,1671,185
1707,Koniec,1234,1,1,26,26,254
1715,R-C-,RC,1,2,5005,5005,152
1716,KOMORNIKI,KOMY,2,4,34258,34258,84
1721,Pocahontas,Gg,1,2,5770,5770,147
1724,Punkty+Premium+i+Flagi,Witamy,36,63,255952,255952,43
1727,Lykanie,LK,1,0,0,0,279
1728,fffff,fffff,1,1,3440,3440,164
1729,Gallowo,GAL,1,7,15214,15214,111
1734,Woir,Wrrrr,1,1,5703,5703,148
1735,Strong+Ekipa,SE,32,118,416675,416675,33
1737,Samiec+Alfa,Alfa,1,0,0,0,280
1740,T.W.,%3DTW%3D,1,19,122227,122227,52
1745,Dni+w+Plemieniu,DWP,1,2,15245,15245,110
1750,CZY+TO+X%3F,Xx,1,0,0,0,281
1751,xddd,xddd,1,0,68,68,244
1753,eeee,eeee,1,1,810,810,201
1754,PogromcY,PY,1,1,1184,1184,192
1755,cudo,C%21%21,1,1,1111,1111,195
1757,Lublin,LUB,1,1,1400,1400,188
1758,Oddam+wioski,OW,1,5,26349,26349,91
1760,Qwer,Qwe,1,4,8366,8366,131
1763,Altra,ALR,1,5,24623,24623,94
1764,Traktor,TRK,1,1,26,26,255
1770,ooooo,ooo,1,1,153,153,236
1771,WD40,30,1,2,7046,7046,140
1772,Jdhd,Hdhdh,1,1,2516,2516,173
1777,Chlip,CHP,1,1,998,998,196
1779,1905,CWKS,1,2,7537,7537,134
1780,Lololololol,Lol,2,0,0,0,282
1782,disco,dsc,1,1,676,676,206
1783,Niszczycielski+Akwedukt,NA,2,2,1747,1747,182
1785,HELLO,HELLO,2,2,1343,1343,190
1786,Pomy%C5%9Bl+zanim+kopniesz+Qunia,Q%C5%84.,1,1,3883,3883,162
1787,WCF+%21,WCF,1,1,26,26,256
1790,Kruk,-KR-,1,8,33111,33111,86
1791,Wymiana,Flagi,1,1,26,26,257
1792,Winners,Win,1,1,383,383,216
1793,Sam1,Sam1,1,11,67586,67586,65
1795,Kukabaka,kUKLA,2,2,603,603,209
1797,Mi%C5%82o%C5%9Bnicy+Taniego+Piwa,Browar,18,19,21896,21896,97
1798,Gggg,Ggg,1,1,5029,5029,151
1799,Kkkkk,Kkkkk,2,2,52,52,245
1802,weRFAS,DFSAFS,2,2,103,103,241
1803,czarnuchowo,WPDS,1,1,162,162,235
1804,12345,12345,3,3,78,78,243
1806,Kto+zjad%C5%82+ciastka%3F,KZC%3F,1,1,221,221,228
1807,ZaPPFrakcja+W,CSA-W,1,0,668,668,207
1808,LECOQ,LECOQ,1,3,20719,20719,98
1809,Vexel,Vexel,1,1,191,191,232
1810,Sobie+Sam,SS,1,1,201,201,229
1811,DziKusY,Dzk,2,2,103,103,242

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,263 @@
2,1,518573688
98,4,1148596
3,7,513901496
68,8,2934283
82,12,1995450
118,13,650623
34,19,11791705
79,24,2170371
56,29,4083236
62,31,3582008
35,33,11535004
8,35,117907676
11,39,90994883
4,47,467872721
144,53,328407
119,56,632131
61,59,3643561
45,68,7073381
29,71,17132708
126,72,544908
25,77,24603199
21,80,36196035
7,85,121654301
104,89,936121
85,92,1913549
71,96,2816660
122,97,598608
55,106,4489957
22,112,30162886
132,115,476582
67,117,3041909
1,120,575766755
83,125,1945540
64,129,3421838
95,134,1255473
81,147,2028269
49,157,6376060
209,159,35302
167,176,158224
139,185,377805
251,187,1367
20,194,38570320
225,200,23586
151,206,242627
59,210,3760105
70,211,2893518
101,214,993612
213,216,32443
120,220,630577
66,234,3106000
182,236,91702
211,255,35260
50,256,6123731
178,260,101651
170,281,140209
87,285,1526835
233,287,11666
253,290,539
17,291,63046795
18,301,54807871
158,305,198650
16,309,65460188
164,317,182517
115,319,708504
149,336,267052
242,339,5461
112,355,760905
200,365,52241
5,369,177967660
114,373,711036
197,374,54819
89,375,1417749
52,377,5516679
141,382,359638
86,385,1780581
207,397,36806
40,412,7844341
156,413,215538
235,415,10061
163,429,184774
27,430,19841316
41,432,7710423
159,435,197777
46,441,7053877
184,443,83584
161,451,188672
38,452,9604806
218,474,28931
96,475,1255265
238,503,7494
72,517,2615421
134,520,454684
136,523,437089
43,546,7268867
42,548,7387675
146,554,322799
217,557,29930
30,594,16158300
172,597,139493
91,607,1329820
162,624,185431
193,625,66255
236,626,8121
147,633,269857
168,636,149408
103,647,991269
97,651,1202654
90,664,1371321
14,666,67663161
117,686,672292
174,689,135903
33,693,13927849
23,722,28486103
246,723,4620
128,733,512496
107,750,876738
94,758,1256466
140,766,365059
78,778,2174294
10,785,107688398
63,786,3554001
131,806,476872
165,809,171639
77,822,2340609
12,830,87500446
190,841,69410
75,847,2499022
6,862,137050699
84,936,1940894
65,944,3297382
223,945,27441
179,963,97544
222,965,27527
74,989,2543700
129,991,500661
32,1023,14775879
13,1039,85035694
36,1040,11104753
44,1052,7076030
108,1058,863124
58,1079,3828584
110,1096,792047
28,1108,17765763
183,1127,83875
15,1128,66590221
48,1140,6606194
39,1148,8067345
100,1161,996140
187,1163,77166
234,1166,11428
221,1170,27655
106,1209,886014
37,1226,10190721
57,1232,3875472
192,1247,66890
153,1258,223069
230,1261,13732
137,1275,399365
130,1278,481948
53,1293,4834337
76,1312,2363357
204,1317,46145
160,1333,197267
26,1336,20414438
177,1338,113620
176,1347,125259
152,1357,224264
93,1368,1288589
191,1372,68452
47,1376,6847914
201,1389,51601
102,1399,992741
19,1411,47947434
157,1416,214684
69,1418,2914447
210,1421,35273
133,1423,471241
121,1428,630185
123,1431,594841
113,1432,733473
169,1448,149206
111,1456,785196
255,1460,381
88,1466,1450455
127,1470,528181
142,1477,358992
24,1480,26541802
80,1483,2062188
226,1484,22060
216,1494,30432
175,1498,126080
9,1523,117452472
185,1526,81749
51,1528,5769388
99,1530,1117026
199,1535,52879
249,1538,3192
138,1551,395786
196,1573,56642
247,1582,3987
229,1585,13876
214,1588,31524
224,1590,26580
54,1597,4762478
166,1599,165273
109,1602,805496
180,1609,97494
202,1610,48607
31,1621,16042983
231,1626,13439
143,1627,334012
154,1636,221031
116,1638,699804
244,1643,4920
212,1645,33370
92,1648,1299521
73,1651,2577567
150,1652,261207
243,1656,5332
155,1657,215830
208,1669,36495
241,1672,5468
148,1680,267604
189,1681,69556
194,1683,64961
173,1687,137468
228,1690,16936
188,1691,74062
227,1692,17669
125,1700,575954
258,1705,62
239,1715,6946
124,1716,584874
232,1721,12907
105,1724,934176
237,1727,7801
240,1729,6680
195,1734,64596
135,1735,454224
171,1737,140112
186,1740,81233
145,1745,323681
205,1750,43707
263,1753,2
262,1754,10
254,1755,395
252,1757,1278
215,1758,30731
220,1760,27699
203,1763,46599
257,1770,124
198,1771,54425
245,1772,4774
261,1777,10
256,1779,207
60,1780,3660507
259,1783,52
250,1785,1705
206,1790,43136
181,1793,97199
260,1795,40
219,1797,28823
248,1808,3755

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,214 @@
2,1,197811951
162,4,7808
4,7,134191270
91,8,155525
113,12,71331
118,13,63826
29,19,3109409
81,24,205544
60,29,426082
68,31,271134
99,33,128802
6,35,68371296
8,39,38636284
1,47,237866835
188,53,1297
102,56,107411
108,59,90043
44,68,1097666
15,71,8857798
132,72,38620
34,77,2196064
25,80,4699158
5,85,86384602
105,89,94543
80,92,208853
128,96,40098
136,97,33470
39,106,1608248
38,112,1711002
141,115,25141
145,117,21965
3,120,140311413
100,125,110559
110,129,82762
62,134,397211
111,147,80447
61,157,418012
151,176,16504
165,185,7378
31,194,2617133
209,200,30
85,210,178718
71,211,257208
126,214,41525
212,216,12
160,220,8278
65,234,362768
203,236,52
33,256,2264454
155,260,10522
90,285,160904
174,287,4521
9,291,37122902
11,301,27416924
147,305,19292
10,309,36519242
117,319,67239
177,336,3986
7,369,59026086
127,373,40352
201,374,99
78,375,212543
67,377,331213
197,382,291
92,385,153097
52,412,653722
32,430,2549096
24,432,5119612
146,435,20699
55,441,609532
191,443,1031
48,452,725521
137,475,30918
184,503,2275
171,517,4826
96,520,137000
175,523,4107
35,546,2097153
41,548,1309325
208,554,32
189,557,1239
37,594,1766507
159,597,8289
74,607,222168
182,624,2475
122,633,51266
123,636,48384
112,647,72783
97,651,136651
149,664,18675
17,666,8136342
119,686,61938
23,693,5125520
27,722,3745388
95,733,141728
107,750,91301
77,758,212637
129,766,40018
153,778,16261
16,785,8763144
58,786,492119
83,806,187855
76,822,214844
20,830,6182634
152,841,16412
73,847,249481
12,862,18925685
40,936,1367259
72,944,249585
199,945,114
168,963,6190
183,965,2359
49,989,702186
104,991,99680
46,1023,869386
13,1039,10258911
36,1040,1922517
51,1052,664412
124,1058,44295
84,1079,182039
134,1096,36721
30,1108,2998016
135,1127,35542
18,1128,7828246
21,1140,6065875
42,1148,1223288
120,1161,59985
139,1163,28985
194,1166,365
169,1170,6131
82,1209,200678
26,1226,4252645
86,1232,171874
167,1261,6589
63,1275,394386
148,1278,19193
66,1293,351864
53,1312,641730
206,1317,42
170,1333,5757
28,1336,3120017
211,1347,15
140,1357,26793
93,1368,149732
178,1372,3874
47,1376,783132
121,1399,57170
22,1411,5712715
156,1416,10013
64,1418,364951
180,1421,3128
114,1423,70186
54,1428,610324
163,1431,7530
115,1432,67981
98,1448,132845
154,1456,11762
103,1466,101232
57,1470,507857
192,1477,375
19,1480,7187879
87,1483,171122
166,1494,7195
210,1498,19
14,1523,9704033
176,1526,4100
59,1528,476359
133,1530,36737
161,1535,7897
109,1551,86090
195,1573,326
202,1582,55
198,1585,281
142,1588,25002
50,1597,699830
130,1599,39978
144,1602,23331
204,1609,52
43,1621,1204990
157,1626,9530
138,1627,29761
75,1636,220320
101,1638,107892
173,1643,4638
45,1648,1091715
89,1651,166503
70,1652,258353
185,1656,2129
131,1657,38951
158,1669,9237
214,1672,1
88,1680,167187
143,1681,24465
187,1683,1682
186,1687,1713
193,1691,370
150,1692,17635
116,1700,67818
56,1716,523524
172,1721,4653
79,1724,210586
200,1729,106
69,1735,261212
190,1737,1032
164,1745,7416
213,1763,9
94,1780,142522
205,1783,50
196,1785,296
125,1790,43136
106,1793,91636
207,1795,40
181,1797,2963
179,1808,3755

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,259 @@
3,1,225228925
90,4,1123538
2,7,263753262
66,8,2442607
78,12,1791675
115,13,586792
33,19,7654576
73,24,1964044
51,29,3593415
57,31,3184570
31,33,7982804
15,35,31145726
12,39,40821572
4,47,123736361
133,53,327110
117,56,524360
56,59,3238973
44,68,5634475
34,71,7464048
118,72,506287
22,77,18308136
17,80,27243988
18,85,27003725
99,89,819602
81,92,1704695
61,96,2767578
116,97,543960
65,106,2462841
19,112,24098705
124,115,432992
63,117,2637247
1,120,275985429
77,125,1826223
55,129,3272339
98,134,819642
74,147,1947811
47,157,5019241
200,159,35302
159,176,141720
129,185,370427
245,187,1367
16,194,29684725
210,200,23556
142,206,242627
54,210,3465830
67,211,2411001
101,214,791197
217,216,17866
112,220,600370
62,234,2742706
172,236,91650
201,255,35260
60,256,2894965
173,260,91124
168,281,109440
86,285,1307440
227,287,7145
248,290,539
21,291,19215296
37,301,6535547
154,305,178401
30,309,8654616
153,317,182517
109,319,638904
141,336,263066
233,339,5461
103,355,760905
189,365,52241
13,369,40063000
107,373,670466
186,374,54720
89,375,1196041
45,377,5092537
130,382,359347
83,385,1615856
199,397,36806
38,412,6455126
145,413,215538
222,415,10061
151,429,184774
24,430,16198878
71,432,2040888
158,435,162816
39,441,6276638
175,443,82553
150,451,188672
32,452,7812313
204,474,28931
87,475,1224347
234,503,5219
64,517,2609213
137,520,313250
125,523,432982
48,546,4265938
49,548,4231284
134,554,322767
205,557,28691
28,594,11702793
162,597,131188
92,607,1091090
152,624,182954
179,625,66255
225,626,8121
144,633,218591
169,636,100862
96,647,893889
93,651,1039367
85,664,1352646
11,666,48673656
111,686,602468
161,689,135903
35,693,7123124
20,722,22187796
237,723,4620
132,733,328377
105,750,735077
95,758,1010984
135,766,322406
70,778,2157999
7,785,82756525
75,786,1933759
140,806,276830
156,809,171639
76,822,1928071
8,830,71201569
188,841,52998
69,847,2174797
5,862,102003847
119,936,477351
59,944,2990567
207,945,27327
174,963,90726
209,965,25168
82,989,1684724
128,991,393721
29,1023,11625728
9,1039,60773093
36,1040,6807047
40,1052,6131889
100,1058,811470
68,1079,2218970
104,1096,752682
26,1108,13489103
192,1127,48333
10,1128,54959104
123,1140,443639
41,1148,5970530
121,1161,473253
193,1163,47907
221,1166,11063
216,1170,19000
110,1209,635798
43,1226,5653666
52,1232,3588148
178,1247,66890
143,1258,223069
229,1261,6352
235,1275,4979
122,1278,462546
50,1293,3808642
84,1312,1606187
195,1317,46103
149,1333,191510
25,1336,15231713
167,1338,113618
165,1347,125244
147,1357,197411
91,1368,1114375
181,1372,64564
42,1376,5740497
190,1389,51599
97,1399,860657
14,1411,37052780
146,1416,204671
80,1418,1755743
202,1421,32137
127,1423,401050
223,1428,9859
114,1431,587311
108,1432,665488
219,1448,16361
102,1456,769792
250,1460,381
88,1466,1198208
215,1470,20287
131,1477,358617
23,1480,17353003
79,1483,1762582
212,1484,22040
211,1494,23237
163,1498,126061
6,1523,92201588
184,1526,60390
46,1528,5076313
94,1530,1014380
197,1535,44982
242,1538,3192
139,1551,283986
185,1573,56269
239,1582,3932
220,1585,13591
228,1588,6522
208,1590,26580
53,1597,3485788
164,1599,125295
120,1602,475515
171,1609,97442
191,1610,48607
27,1621,12298812
240,1626,3909
138,1627,302691
247,1636,711
113,1638,591912
251,1643,282
206,1645,28423
148,1648,194797
72,1651,2038539
243,1652,2854
241,1656,3203
155,1657,176879
214,1669,21765
232,1672,5467
170,1680,97513
196,1681,45091
182,1683,63279
166,1687,117365
218,1690,16936
177,1691,73692
255,1692,34
126,1700,428112
254,1705,62
230,1715,6260
183,1716,61350
224,1721,8254
106,1724,708479
226,1727,7801
238,1729,4434
180,1734,64596
157,1735,165821
160,1737,139080
176,1740,81019
136,1745,316265
198,1750,43707
259,1753,2
256,1754,10
249,1755,395
246,1757,1278
203,1758,30731
194,1763,46590
253,1770,124
187,1771,54425
236,1772,4774
257,1777,10
252,1779,207
58,1780,3113092
258,1783,2
244,1785,1409
231,1793,5563
213,1797,21860

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
a:1:{s:5:"pl181";s:25:"https://pl181.plemiona.pl";}

View File

@ -0,0 +1,15 @@
- model: Server
rows:
- _id: us63
key: us63
url: https://us63.tribalwars.us
open: true
special: false
num_players: 1438
num_tribes: 125
num_villages: 10048
num_player_villages: 5386
num_barbarian_villages: 4662
num_bonus_villages: 3155
created_at: 2023-01-04T22:00:08.748927Z
version_code: us

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
9158,1676958836,848955563,848955598,0,185,778
8655,1676959184,282832,0,0,167,111
8610,1676959781,750685,0,0,76,103
1111,1676959935,848927565,0,0,138,964
5288,1676960486,848914361,0,0,20,273

View File

@ -0,0 +1,205 @@
package watermillamqptest
import (
"fmt"
"net"
"net/url"
"os"
"time"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermilltest"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill-amqp/v2/pkg/amqp"
"github.com/cenkalti/backoff/v4"
"github.com/ory/dockertest/v3"
"github.com/ory/dockertest/v3/docker"
"github.com/stretchr/testify/require"
)
type RabbitMQ struct {
connectionString *url.URL
resource *dockertest.Resource
}
type rabbitMQConfig struct {
repo string
tag string
ttl uint
}
type RabbitMQOption func(cfg *rabbitMQConfig)
const rabbitMQDefaultTTL = 60
func newRabbitMQConfig(opts ...RabbitMQOption) *rabbitMQConfig {
cfg := &rabbitMQConfig{
repo: "rabbitmq",
tag: "3.12.10-alpine",
ttl: rabbitMQDefaultTTL,
}
for _, opt := range opts {
opt(cfg)
}
return cfg
}
func WithRabbitMQTTL(ttlSeconds uint) RabbitMQOption {
return func(cfg *rabbitMQConfig) {
cfg.ttl = ttlSeconds
}
}
func WithRabbitMQImage(image string) RabbitMQOption {
return func(cfg *rabbitMQConfig) {
cfg.repo, cfg.tag = docker.ParseRepositoryTag(image)
}
}
// NewRabbitMQ constructs a new RabbitMQ resource. If the env variable 'TESTS_RABBITMQ_CONNECTION_STRING' is set,
// this function doesn't run a new Docker container and uses the value of this variable as a connection string,
// otherwise this function runs a new RabbitMQ instance in a Docker container.
// This function is intended for use in TestMain.
func NewRabbitMQ(pool *dockertest.Pool, opts ...RabbitMQOption) (*RabbitMQ, error) {
cfg := newRabbitMQConfig(opts...)
if connString := os.Getenv("TESTS_RABBITMQ_CONNECTION_STRING"); connString != "" {
u, err := url.ParseRequestURI(connString)
if err != nil {
return nil, err
}
return &RabbitMQ{
connectionString: u,
}, nil
}
u := &url.URL{
Scheme: "amqp",
User: url.UserPassword("rmq", "rmq"),
Path: "/",
}
pw, _ := u.User.Password()
resource, err := pool.RunWithOptions(&dockertest.RunOptions{
Repository: cfg.repo,
Tag: cfg.tag,
Env: []string{
fmt.Sprintf("RABBITMQ_DEFAULT_USER=%s", u.User.Username()),
fmt.Sprintf("RABBITMQ_DEFAULT_PASS=%s", pw),
},
}, func(config *docker.HostConfig) {
config.AutoRemove = true
config.RestartPolicy = docker.RestartPolicy{
Name: "no",
}
})
if err != nil {
return nil, fmt.Errorf("couldn't run rabbitmq: %w", err)
}
if err = resource.Expire(cfg.ttl); err != nil {
return nil, err
}
u.Host, err = getHostPort(resource, "5672/tcp")
if err != nil {
return nil, err
}
return &RabbitMQ{
connectionString: u,
resource: resource,
}, nil
}
const (
rabbitMQOpenConnBackOffMaxInterval = 5 * time.Second
rabbitMQOpenConnBackOffMaxElapsedTime = 30 * time.Second
)
func (rmq *RabbitMQ) NewConnection(tb watermilltest.TestingTB) *amqp.ConnectionWrapper {
tb.Helper()
require.NotNil(tb, rmq, "rabbit mq resource not property initialized")
require.NotNil(tb, rmq.connectionString, "rabbit mq resource not properly initialized")
connConfig := amqp.ConnectionConfig{AmqpURI: rmq.connectionString.String()}
bo := backoff.NewExponentialBackOff()
bo.MaxInterval = rabbitMQOpenConnBackOffMaxInterval
bo.MaxElapsedTime = rabbitMQOpenConnBackOffMaxElapsedTime
require.NoError(tb, backoff.Retry(func() error {
conn, err := amqp.NewConnection(connConfig, watermill.NopLogger{})
if err != nil {
return err
}
_ = conn.Close()
return nil
}, bo))
conn, err := amqp.NewConnection(connConfig, watermill.NopLogger{})
require.NoError(tb, err)
tb.Cleanup(func() {
_ = conn.Close()
})
return conn
}
func (rmq *RabbitMQ) Close() error {
if rmq != nil && rmq.resource != nil {
if err := rmq.resource.Close(); err != nil {
return err
}
}
return nil
}
type TopicNameGenerator func(topic string) string
func NewPubSub(
tb watermilltest.TestingTB,
conn *amqp.ConnectionWrapper,
queueNameGenerator amqp.QueueNameGenerator,
exchangeAndRoutingKeyNameGenerator TopicNameGenerator,
) (*amqp.Publisher, *amqp.Subscriber) {
tb.Helper()
cfg := amqp.NewNonDurablePubSubConfig("", queueNameGenerator)
cfg.Consume.NoRequeueOnNack = true
cfg.Consume.Qos.PrefetchCount = 1
cfg.Exchange.GenerateName = exchangeAndRoutingKeyNameGenerator
cfg.QueueBind.GenerateRoutingKey = exchangeAndRoutingKeyNameGenerator
publisher, err := amqp.NewPublisherWithConnection(cfg, watermill.NopLogger{}, conn)
require.NoError(tb, err)
tb.Cleanup(func() {
_ = publisher.Close()
})
subscriber, err := amqp.NewSubscriberWithConnection(cfg, watermill.NopLogger{}, conn)
require.NoError(tb, err)
tb.Cleanup(func() {
_ = subscriber.Close()
})
return publisher, subscriber
}
func getHostPort(resource *dockertest.Resource, id string) (string, error) {
dockerURL := os.Getenv("DOCKER_HOST")
if dockerURL == "" {
return resource.GetHostPort(id), nil
}
u, err := url.Parse(dockerURL)
if err != nil {
return "", err
}
return net.JoinHostPort(u.Hostname(), resource.GetPort(id)), nil
}

View File

@ -5,7 +5,7 @@ import (
"testing"
"time"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermillmsg"
"gitea.dwysokinski.me/twhelp/corev3/internal/watermill/watermillmsg"
"github.com/ThreeDotsLabs/watermill"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"

View File

@ -0,0 +1,9 @@
package watermilltest
// TestingTB is a subset of the API provided by both *testing.T and *testing.B.
type TestingTB interface {
Helper()
Errorf(format string, args ...interface{})
FailNow()
Cleanup(f func())
}

View File

@ -0,0 +1,84 @@
package watermilltest
import (
"context"
"time"
"github.com/ThreeDotsLabs/watermill"
"github.com/ThreeDotsLabs/watermill/message"
"github.com/ThreeDotsLabs/watermill/pubsub/gochannel"
"github.com/stretchr/testify/require"
)
type Registerer interface {
Register(router *message.Router)
}
func RunRouter(tb TestingTB, rs ...Registerer) *message.Router {
tb.Helper()
return RunRouterWithContext(tb, context.Background(), rs...)
}
const routerCloseTimeout = 10 * time.Second
//nolint:revive
func RunRouterWithContext(tb TestingTB, ctx context.Context, rs ...Registerer) *message.Router {
tb.Helper()
router, err := message.NewRouter(message.RouterConfig{CloseTimeout: routerCloseTimeout}, watermill.NopLogger{})
require.NoError(tb, err)
tb.Cleanup(func() {
_ = router.Close()
})
for _, r := range rs {
r.Register(router)
}
go func() {
require.NoError(tb, router.Run(ctx))
}()
<-router.Running()
return router
}
type MiddlewareRegisterer struct {
H message.HandlerMiddleware
}
var _ Registerer = MiddlewareRegisterer{}
func (m MiddlewareRegisterer) Register(router *message.Router) {
router.AddMiddleware(m.H)
}
func NewWaitForHandlerMiddleware(handlerName string) (MiddlewareRegisterer, <-chan struct{}) {
ch := make(chan struct{})
return MiddlewareRegisterer{
H: func(h message.HandlerFunc) message.HandlerFunc {
return func(msg *message.Message) ([]*message.Message, error) {
if message.HandlerNameFromCtx(msg.Context()) != handlerName {
return h(msg)
}
result, err := h(msg)
if len(result) == 0 && err == nil {
close(ch)
}
return result, err
}
},
}, ch
}
func NewPubSub(tb TestingTB) *gochannel.GoChannel {
tb.Helper()
pubSub := gochannel.NewGoChannel(gochannel.Config{Persistent: true}, watermill.NopLogger{})
tb.Cleanup(func() {
_ = pubSub.Close()
})
return pubSub
}